Как я могу разбудить сценарий удара сна?

Действительно ли возможно разбудить процесс, который приостанавливается с помощью sleep команда?


Как пример, позволяет, говорят, что у Вас есть этот сценарий:

#!/bin/bash
echo "I am tired"
sleep 8h
echo "I am fresh :)"

После 30 минут Вы обнаруживаете необходимость в сценарии для остановки, то есть, Вам было жаль, что Вы не записали sleep 30m вместо этого.

Вы не хотите ни к одному вызову kill PID или нажмите Ctrl+C, с тех пор последняя команда не выполняется, и Вы останетесь усталыми.

Есть ли способ разбудить процесс от sleep или, возможно, используйте другую команду, которая поддерживает пробуждение? Решения и фоновых и приоритетных процессов приветствуются.

27
задан 21 January 2015 в 02:50

4 ответа

Когда сценарий Bash выполняет a sleep, вот что pstree мог бы быть похожим:

bash(10102)───sleep(8506)

У обоих есть идентификаторы процесса (PIDs), работая как сценарий. Если бы мы хотели прервать сон, то мы отправили бы kill 8506 и сессия Bash возобновилась бы... Проблема находится в среде в виде сценария, мы не знаем PID sleep управляйте и нет человека для рассмотрения дерева процесса.

Мы можем передать PID сессии Bash $$ волшебная переменная. Если мы можем сохранить это где-нибудь, мы можем затем быть нацелены на экземпляры sleep это работает под тем PID. Вот то, что я вставил сценарий:

# write the current session's PID to file
echo $$ >> myscript.pid

# go to sleep for a long time
sleep 1000

И затем мы можем сказать pkill уничтожить sleep экземпляры, работающие, подо что PID:

pkill -P $(<myscript.pid) sleep

Снова, это ограничивает себя только sleep процессы, работающие непосредственно под той одной сессией Bash. Пока PID был зарегистрирован правильно, это делает его намного более безопасным, чем killall sleep или pkill sleep, который мог уничтожить любого sleep процесс в системе (разрешение полномочий).

Мы можем доказать, что теория со следующим примером, где у нас есть три отдельных сессии удара, два выполнения sleep. Только потому, что мы указываем PID верхней левой сессии удара, только sleep уничтожается.

enter image description here


Альтернативный подход должен продвинуть sleep в фон сохраните его PID и затем возвратите его в передний план. В сценарии:

sleep 1000 &
echo $! > myscript.sleep.pid
fg

И уничтожить его:

kill $(<myscript.sleep.pid)
47
ответ дан 23 November 2019 в 01:02

Вы могли записать, что Ваш сценарий для обработки ("захватывает") другие сигналы от уничтожения и т.д., таким образом, Вы могли изменить поведение сценариев по мере необходимости. Посмотрите удар человека:

SIGNALS
   When  bash  is  interactive,  in the absence of any traps, it ignores SIGTERM (so that kill 0 does not
   kill an interactive shell), and SIGINT is caught and handled (so that the wait builtin  is  interrupt-
   ible).   In all cases, bash ignores SIGQUIT.  If job control is in effect, bash ignores SIGTTIN, SIGT-
   TOU, and SIGTSTP.

   Non-builtin commands run by bash have signal handlers set to the values inherited by  the  shell  from
   its  parent.   When  job  control is not in effect, asynchronous commands ignore SIGINT and SIGQUIT in
   addition to these inherited handlers.  Commands run as a result of  command  substitution  ignore  the
   keyboard-generated job control signals SIGTTIN, SIGTTOU, and SIGTSTP.

   The shell exits by default upon receipt of a SIGHUP.  Before exiting, an interactive shell resends the
   SIGHUP to all jobs, running or stopped.  Stopped jobs are sent SIGCONT to ensure that they receive the
   SIGHUP.   To  prevent the shell from sending the signal to a particular job, it should be removed from
   the jobs table with the disown builtin (see SHELL BUILTIN COMMANDS below) or  marked  to  not  receive
   SIGHUP using disown -h.

   If  the huponexit shell option has been set with shopt, bash sends a SIGHUP to all jobs when an inter-
   active login shell exits.

   If bash is waiting for a command to complete and receives a signal for which a trap has been set,  the
   trap  will not be executed until the command completes.  When bash is waiting for an asynchronous com-
   mand via the wait builtin, the reception of a signal for which a trap has been set will cause the wait
   builtin  to  return immediately with an exit status greater than 128, immediately after which the trap
   is executed.
5
ответ дан 23 November 2019 в 01:02

Вы могли просто уничтожить сон, который продолжится к следующей строке сценария:

pkill sleep

Примечание, что это уничтожило бы любой спящий процесс, работающий в Вашей системе, не только в Вашем сценарии.

4
ответ дан 23 November 2019 в 01:02

У меня есть сценарий удара сна, запущенный cron на начальной загрузке. Сценарий просыпается каждую минуту и устанавливает яркость дисплея портативного компьютера на основе восхода солнца и заката, полученного из Интернета. Настраиваемый этап перехода пользователя между полным, ярким и полным тусклый, требует значений усиления и понижения 3, 4, 5 или независимо от того, что вычисляется каждую минуту.

Oli, кратко тронутый pstree в его ответе, но отклоненный это, потому что это уничтожило бы все sleep экземпляры. Этого можно избежать путем сужения поиска с помощью pstree опции.

Используя pstree -h мы видим всю иерархию:

$ pstree -h
systemd─┬─ModemManager─┬─{gdbus}
        │              └─{gmain}
        ├─NetworkManager─┬─dhclient
        │                ├─dnsmasq
        │                ├─{gdbus}
        │                └─{gmain}
        ├─accounts-daemon─┬─{gdbus}
        │                 └─{gmain}
        ├─acpid
        ├─agetty
        ├─atd
        ├─avahi-daemon───avahi-daemon
        ├─cgmanager
        ├─colord─┬─{gdbus}
        │        └─{gmain}
        ├─cron───cron───sh───display-auto-br───sleep
        ├─cups-browsed─┬─{gdbus}
        │              └─{gmain}
        ├─dbus-daemon
        ├─fwupd─┬─3*[{GUsbEventThread}]
        │       ├─{fwupd}
        │       ├─{gdbus}
        │       └─{gmain}
        ├─gnome-keyring-d─┬─{gdbus}
        │                 ├─{gmain}
        │                 └─{timer}
        ├─irqbalance
        ├─lightdm─┬─Xorg───3*[{Xorg}]
        │         ├─lightdm─┬─upstart─┬─at-spi-bus-laun─┬─dbus-daemon
        │         │         │         │                 ├─{dconf worker}
        │         │         │         │                 ├─{gdbus}
        │         │         │         │                 └─{gmain}
        │         │         │         ├─at-spi2-registr─┬─{gdbus}
        │         │         │         │                 └─{gmain}
        │         │         │         ├─bamfdaemon─┬─{dconf worker}
        │         │         │         │            ├─{gdbus}
        │         │         │         │            └─{gmain}
        │         │         │         ├─chrome─┬─2*[cat]
        │         │         │         │        ├─chrome─┬─chrome─┬─2*[chrome─┬─{Chrome_ChildIOT}]
        │         │         │         │        │        │        │           ├─5*[{CompositorTileW}]]
        │         │         │         │        │        │        │           ├─{Compositor}]
        │         │         │         │        │        │        │           ├─{GpuMemoryThread}]
        │         │         │         │        │        │        │           ├─{MemoryInfra}]
        │         │         │         │        │        │        │           ├─{Renderer::FILE}]
        │         │         │         │        │        │        │           ├─{TaskSchedulerRe}]
        │         │         │         │        │        │        │           └─{TaskSchedulerSe}]
        │         │         │         │        │        │        ├─7*[chrome─┬─{Chrome_ChildIOT}]
        │         │         │         │        │        │        │           ├─5*[{CompositorTileW}]]
        │         │         │         │        │        │        │           ├─{Compositor}]
        │         │         │         │        │        │        │           ├─{GpuMemoryThread}]
        │         │         │         │        │        │        │           ├─{MemoryInfra}]
        │         │         │         │        │        │        │           ├─{Renderer::FILE}]
        │         │         │         │        │        │        │           ├─{ScriptStreamerT}]
        │         │         │         │        │        │        │           ├─{TaskSchedulerRe}]
        │         │         │         │        │        │        │           └─{TaskSchedulerSe}]
        │         │         │         │        │        │        ├─chrome─┬─{Chrome_ChildIOT}
        │         │         │         │        │        │        │        ├─5*[{CompositorTileW}]
        │         │         │         │        │        │        │        ├─{Compositor}
        │         │         │         │        │        │        │        ├─{GpuMemoryThread}
        │         │         │         │        │        │        │        ├─{Media}
        │         │         │         │        │        │        │        ├─{MemoryInfra}
        │         │         │         │        │        │        │        ├─{Renderer::FILE}
        │         │         │         │        │        │        │        ├─{ScriptStreamerT}
        │         │         │         │        │        │        │        ├─{TaskSchedulerRe}
        │         │         │         │        │        │        │        └─{TaskSchedulerSe}
        │         │         │         │        │        │        └─2*[chrome─┬─{Chrome_ChildIOT}]
        │         │         │         │        │        │                    ├─5*[{CompositorTileW}]]
        │         │         │         │        │        │                    ├─{Compositor}]
        │         │         │         │        │        │                    ├─{GpuMemoryThread}]
        │         │         │         │        │        │                    ├─{Renderer::FILE}]
        │         │         │         │        │        │                    ├─{ScriptStreamerT}]
        │         │         │         │        │        │                    ├─{TaskSchedulerRe}]
        │         │         │         │        │        │                    └─{TaskSchedulerSe}]
        │         │         │         │        │        └─nacl_helper
        │         │         │         │        ├─chrome─┬─chrome
        │         │         │         │        │        ├─{Chrome_ChildIOT}
        │         │         │         │        │        ├─{MemoryInfra}
        │         │         │         │        │        ├─{TaskSchedulerSe}
        │         │         │         │        │        └─{Watchdog}
        │         │         │         │        ├─{AudioThread}
        │         │         │         │        ├─{BrowserWatchdog}
        │         │         │         │        ├─{Chrome_CacheThr}
        │         │         │         │        ├─{Chrome_DBThread}
        │         │         │         │        ├─{Chrome_FileThre}
        │         │         │         │        ├─{Chrome_FileUser}
        │         │         │         │        ├─{Chrome_HistoryT}
        │         │         │         │        ├─{Chrome_IOThread}
        │         │         │         │        ├─{Chrome_ProcessL}
        │         │         │         │        ├─{Chrome_SyncThre}
        │         │         │         │        ├─{CompositorTileW}
        │         │         │         │        ├─{CrShutdownDetec}
        │         │         │         │        ├─{D-Bus thread}
        │         │         │         │        ├─{Geolocation}
        │         │         │         │        ├─{IndexedDB}
        │         │         │         │        ├─{LevelDBEnv}
        │         │         │         │        ├─{MemoryInfra}
        │         │         │         │        ├─{NetworkChangeNo}
        │         │         │         │        ├─{Networking Priv}
        │         │         │         │        ├─4*[{TaskSchedulerBa}]
        │         │         │         │        ├─6*[{TaskSchedulerFo}]
        │         │         │         │        ├─{TaskSchedulerSe}
        │         │         │         │        ├─{WorkerPool/3166}
        │         │         │         │        ├─{WorkerPool/5824}
        │         │         │         │        ├─{WorkerPool/5898}
        │         │         │         │        ├─{WorkerPool/6601}
        │         │         │         │        ├─{WorkerPool/6603}
        │         │         │         │        ├─{WorkerPool/7313}
        │         │         │         │        ├─{chrome}
        │         │         │         │        ├─{dconf worker}
        │         │         │         │        ├─{extension_crash}
        │         │         │         │        ├─{gdbus}
        │         │         │         │        ├─{gmain}
        │         │         │         │        ├─{gpu-process_cra}
        │         │         │         │        ├─{inotify_reader}
        │         │         │         │        ├─{renderer_crash_}
        │         │         │         │        ├─{sandbox_ipc_thr}
        │         │         │         │        └─{threaded-ml}
        │         │         │         ├─compiz─┬─{dconf worker}
        │         │         │         │        ├─{gdbus}
        │         │         │         │        ├─{gmain}
        │         │         │         │        └─8*[{pool}]
        │         │         │         ├─conky───6*[{conky}]
        │         │         │         ├─2*[dbus-daemon]

( .... many lines deleted to fit in 30k limit .... )

        ├─vnstatd
        ├─whoopsie─┬─{gdbus}
        │          └─{gmain}
        └─wpa_supplicant

Поскольку Вы видите, что типичная Ubuntu войти в систему содержит много много PIDs (идентификатор Процесса).

Мы можем сузить его к нашему рабочему использованию сценария:

$ pstree -g -p | grep display-auto
  |-cron(1198,1198)---cron(1257,1198)---sh(1308,1308)---display-auto-br(1321,1308)---sleep(26552,1308)

Мы видим:

  • cron запущенный оболочка (обрабатывают идентификатор 1308 и идентификатор 1308 сессии),
  • Оболочка называет нашу программу, работающую в соответствии с идентификатором 1321 процесса и идентификатором 1308 сессии (соответствие оболочке)
  • Наши вызовы программы sleep в соответствии с идентификатором 26552 процесса и снова идентификатором 1308 сессии

В этой точке мы можем использовать pkill -s 1308 и это уничтожило бы всю сессию, которая включает оболочку, нашу программу display-auto-brightness и sleep команда. Вместо этого мы будем использовать kill 26552 только уничтожить команду сна, вынуждающую нашу программу просыпаться и корректировать яркость.

При вводе этого вручную в терминале Вы видите:

───────────────────────────────────────────────────────────────────────────────
rick@dell:~$ pstree -g -p | grep display-auto
             |-cron(1198,1198)---cron(1257,1198)---sh(1308,1308)---display-auto-br(1321,1308)---sleep(32362,1308)
───────────────────────────────────────────────────────────────────────────────
rick@dell:~$ sudo kill 32362
───────────────────────────────────────────────────────────────────────────────
rick@dell:~$ pstree -g -p | grep display-auto
             |-cron(1198,1198)---cron(1257,1198)---sh(1308,1308)---display-auto-br(1321,1308)---sleep(1279,1308)
───────────────────────────────────────────────────────────────────────────────
rick@dell:~$ sudo kill 1279
───────────────────────────────────────────────────────────────────────────────
rick@dell:~$ pstree -g -p | grep display-auto
             |-cron(1198,1198)---cron(1257,1198)---sh(1308,1308)---display-auto-br(1321,1308)---sleep(4440,1308)
───────────────────────────────────────────────────────────────────────────────
rick@dell:~$ 

Следующий шаг должен сделать это, когда ноутбук просыпается от, приостанавливают. Например, когда крышка закрылась, это была полная темнота, и яркость экрана была установлена в "300". Когда крышка открыта, это - дневной свет, и яркость должна быть установлена на "2 000". Конечно, программа проснулась бы на своем собственном через 1 - 59 секунд, но это более удобно для яркости, которая будет установлена немедленно.

Я отправлю приостановить/возобновить код после того, как он будет записан. Надо надеяться, в эти выходные.

1
ответ дан 23 November 2019 в 01:02

Другие вопросы по тегам:

Похожие вопросы: