Как добавить к уже запущенному процессу дополнительную команду «завершение работы»?

11

На регулярной основе я забываю добавлять && shutdown -h nowв длительный процесс. Есть ли способ добавить shutdown -h nowкоманду после того, как первая команда была вызвана? Он не предназначен для прерывания текущего процесса. Может быть, можно посмотреть PID?

Брубэкер
источник
Я надеюсь, вы понимаете, что все, что придет после, &&будет выполнено только в том случае, если предыдущая команда была успешной. Если вы хотите, чтобы он запускался, даже если команда не работает, используйте ;вместо этого.
Зоке

Ответы:

13

Нет необходимости многократно запускать ps, чтобы вывести список всех процессов и выполнить поиск через grep. Фоновый процесс с помощью Ctrl-Z, затем запустите

bg %1 ; wait %1 ; shutdown -h now

Если у вас запущены другие фоновые задания, вам будет дана другая спецификация заданий вместо [1] при нажатии ctrl-z. Если так, используйте это вместо этого.

psusi
источник
3

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

while true; do
  if ps -ef | grep -q '[l]ong-running-process'; then
    sleep 5
  else
    sudo poweroff
  fi
done

Обратите внимание на квадратные скобки в grepвыражении. Это делается для того, чтобы grepпроцесс не соответствовал, если он попал в psсписок. Достаточно окружить любой отдельный символ квадратными скобками.

Скотт Северанс
источник
+1 так как работает. Не так, как я бы это сделал.
Зоке
@Zoke: если есть другой способ, мне было бы интересно.
Скотт Северанс
Написал ответ, а также. Проверьте это, если хотите.
Зоке
Вы также можете использовать kill -0 (pid) для проверки существования процесса без его уничтожения.
пушистый
3

Я делаю это все время.

  1. Начните процесс.
  2. Поймите, что я забыл выполнить свою &&команду.
  3. Нажмите Ctrl+, Zчтобы приостановить процесс и вернуться в оболочку.
  4. Беги fg && shutdown -h nowк:
    1. На передний план и возобновить процесс, который вы только что приостановили.
    2. Затем, после того, как он закончится, он запустит то, что вы хотели запустить.

Кроме того, вы можете опросить, как предлагается в других ответах, как это:

while ps -p $PID ; do sleep 5 ; done ; shutdown -h now
Нафтули Кей
источник
Это сразу отключится.
psusi
ФГ завершает сразу, так что ...
psusi
@psusi нет, не будет
Walking Wiki
@WalkingWiki, странно, ты прав. Клянусь, я проверил это еще в 2012 году, и оно сразу завершилось.
psusi
1

Если вы знаете 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

Zoke
источник
0

Создайте сценарий оболочки для запуска обоих процессов:

MyShellScript.txt:

#!/bin/sh
MyProcessIdLikeToStart -o options && shutdown -h now

После сохранения этого в каталоге, где вы запускаете данный процесс, выполните:

chmod +x MyShellScript.txt

Затем, когда вы захотите выполнить команду, просто наберите, ./MyShellScript.txtи она сделает то же самое для вас.

Крис Карри
источник