Можно ли разбудить процесс, который был приостановлен с помощью sleep
команды?
В качестве примера, скажем, у вас есть этот скрипт:
#!/bin/bash
echo "I am tired"
sleep 8h
echo "I am fresh :)"
Через 30 минут вы обнаружите, что вам нужно остановить сценарий, то есть вы хотели бы написать sleep 30m
вместо этого.
Вы не хотите ни звонить, kill PID
ни нажимать Ctrl+ C, так как тогда последняя команда не будет выполнена, и вы останетесь уставшим.
Есть ли способ разбудить процесс sleep
или, возможно, использовать другую команду, которая поддерживает пробуждение? Решения как фоновых, так и передних процессов приветствуются.
command-line
bash
Bittenus
источник
источник
gawk
ing действительно не работает. В прошлый раз, когда у меня былsleep
процесс размышления, яpushd
поднялся с кровати.#!
строка. И это важно, потому что ответ на ваш вопрос зависит от того, есть ли-e
в#!
очереди.#!/bin/bash -e
, сценарий остановится после ошибки. Простое уничтожение команды sleep будет рассматриваться как ошибка bash. Это означает, что-e
нет достаточно простого ответа на ваш вопрос. Если-e
его использовать, то это становится намного сложнее, потому что вам нужно будет остановить процесс сна, не убивая его.Ответы:
Когда скрипт Bash запускается
sleep
, вот как этоpstree
может выглядеть:Оба имеют идентификаторы процессов (PID) даже при запуске в качестве сценария. Если бы мы хотели прервать сон, мы бы отправили
kill 8506
и сеанс Bash возобновился бы ... Проблема в сценариях, мы не знаем PIDsleep
команды, и нет человека, который бы смотрел на процесс дерево.Мы можем получить PID сеанса Bash через
$$
магическую переменную. Если мы можем сохранить это где-то, мы можем затем нацелить экземплярыsleep
, которые работают под этим PID. Вот что я вставил в сценарий:И тогда мы можем сказать
pkill
ядернымsleep
экземплярам, работающим под этим PID:Опять же, это ограничивается только
sleep
процессами, запущенными непосредственно в этом сеансе Bash. До тех пор, пока PID был зарегистрирован правильно, это делает его намного безопаснее, чемkillall sleep
илиpkill sleep
, что может привести к обесточиванию любогоsleep
процесса в системе (разрешения разрешают).Мы можем доказать , что теория со следующим примером , в котором есть три отдельных Баш сессий, два хода
sleep
. Только потому, что мы указываем PID верхнего левого сеанса bash,sleep
уничтожается только его .Альтернативный подход состоит в том, чтобы нажать
sleep
на задний план, сохранить его PID и затем вернуть его на передний план. В сценарии:И убить это
источник
Вы можете написать свой сценарий для обработки («перехвата») других сигналов от kill и т. Д., Чтобы при необходимости можно было изменить поведение сценариев. Смотри, человек Баш:
источник
Вы можете просто убить сон, который будет продолжаться до следующей строки скрипта:
Обратите внимание, что это убило бы любой спящий процесс, работающий в вашей системе, а не только в вашем скрипте.
источник
У меня есть скрипт bash, запущенный при
cron
загрузке. Сценарий просыпается каждую минуту и устанавливает яркость дисплея ноутбука в зависимости от восхода и захода солнца, полученных из Интернета. Настраиваемая пользователем фаза перехода между полной яркостью и полной яркостью требует увеличения и уменьшения значений на 3, 4, 5 или что-либо другое, рассчитанное каждую минуту.Оли кратко затронул
pstree
в своем ответе, но отклонил его, потому что это убило бы всеsleep
случаи. Этого можно избежать, сузив поиск с помощью параметров pstree.Используя
pstree -h
мы видим всю иерархию:Как видите, типичный логин в Ubuntu содержит много PID (идентификаторов процессов).
Мы можем сузить его до нашего запущенного скрипта, используя:
Мы видим:
cron
запустил оболочку (идентификатор процесса 1308 и идентификатор сеанса 1308)sleep
процесс с идентификатором 26552 и снова сессионный идентификатор 1308На данный момент мы можем использовать,
pkill -s 1308
и это убьет весь сеанс, который включает в себя оболочку, нашу программуdisplay-auto-brightness
иsleep
команду. Вместо этого мы будем использоватьkill 26552
только команду «sleep», которая заставит нашу программу проснуться и отрегулировать яркость.Набрав это вручную в терминале, вы увидите:
Следующий шаг - сделать это, когда ноутбук выйдет из режима ожидания. Например, когда крышка была закрыта, она была полностью темной, а яркость экрана была установлена на «300». Когда крышка открыта, это дневной свет, и яркость должна быть установлена на «2000». Конечно, программа просыпается сама по себе через 1–59 секунд, но более удобно мгновенно устанавливать яркость.
Я опубликую код приостановки / возобновления после того, как он будет написан. Надеюсь, в эти выходные.
источник