Ответы:
Нет необходимости многократно запускать ps, чтобы вывести список всех процессов и выполнить поиск через grep. Фоновый процесс с помощью Ctrl-Z, затем запустите
bg %1 ; wait %1 ; shutdown -h now
Если у вас запущены другие фоновые задания, вам будет дана другая спецификация заданий вместо [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
список. Достаточно окружить любой отдельный символ квадратными скобками.
Я делаю это все время.
&&
команду.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
Создайте сценарий оболочки для запуска обоих процессов:
MyShellScript.txt:
#!/bin/sh
MyProcessIdLikeToStart -o options && shutdown -h now
После сохранения этого в каталоге, где вы запускаете данный процесс, выполните:
chmod +x MyShellScript.txt
Затем, когда вы захотите выполнить команду, просто наберите, ./MyShellScript.txt
и она сделает то же самое для вас.
&&
будет выполнено только в том случае, если предыдущая команда была успешной. Если вы хотите, чтобы он запускался, даже если команда не работает, используйте;
вместо этого.