Регулярно забываю добавлять && shutdown -h now
к длительному процессу. Есть ли способ добавить команду shutdown -h now
после того, как была вызвана первая команда? Он не предназначен для прерывания текущего процесса. Может быть, можно посмотреть PID?
Нет никакой потребности неоднократно выполнить PS для списка всех процессов и grep через вывод. Фон процесс с ctrl-Z, затем выполненным
bg %1 ; wait %1 ; shutdown -h now
Если у Вас будет другое выполнение фоновых заданий, то Вам дадут другой jobspec вместо [1] когда Вы ctrl-z. Если так, используйте это вместо этого.
Вы можете сделать что-то вроде этого, который будет проверять, выполняется ли процесс каждые 5 секунд, и предпринимать соответствующие действия:
while true; do
if ps -ef | grep -q '[l]ong-running-process'; then
sleep 5
else
sudo poweroff
fi
done
Обратите внимание на квадратные скобки в выражении grep
. Это делается для того, чтобы процесс grep
не совпадал, если он попал в список ps
. Достаточно окружить любой отдельный символ квадратными скобками.
Создайте сценарий оболочки для запуска обоих процессов:
MyShellScript.txt:
#!/bin/sh
MyProcessIdLikeToStart -o options && shutdown -h now
После сохранения в каталоге, где вы запускаете данный процесс, выполните:
chmod +x MyShellScript.txt
Затем, когда вы захотите запустить команду, просто наберите ./MyShellScript.txt
, и она сделает то и другое за вас.
Я делаю это все время.
&&
. fg && shutdown -h now
, чтобы: Кроме того, вы можете опросить, как предлагается в других ответах, как это:
while ps -p $PID ; do sleep 5 ; done ; shutdown -h now
Если вы знаете PID, вы можете запустить это:
while ps -p $PID; sleep 5; done; shutdown -h now
Для запуска без эха от PS сделайте это:
while ps -p $PID >/dev/null; sleep 5; done; shutdown -h now
И, наконец, запустить его в фоновом режиме без Вывод:
(while ps -p $PID >/dev/null; sleep 5; done; shutdown -h now ) &
Решение Скотта является хорошим, но это устраняет необходимость в grep
снова и снова, если вы уже знаете pid. И это гораздо быстрее набрать.: P