Можно ли отредактировать командную строку процесса, отправленного в фоновый режим, или связать другую команду для выполнения после выхода первой команды?
Например: я начинаю зеркалировать сайт с wget -m site.com
но позже понимаю, что хочу получать уведомления по электронной почте, когда работа будет выполнена. Задание выполняется в фоновом режиме (bg
). Как я могу добавить && sendmail
к команде, или выполнить ее, когда первая команда завершила выполнение?
Если у вас все еще есть сеанс, из которого вы начали исходную команду, и вы просто хотите знать, когда он завершится, вы можете использовать wait
который будет ждать завершения указанного дочернего процесса. Предполагая использование bash
что-то вроде ...
$ ./30s &
[1] 32135
$ wait %1 && echo hello
[1]+ Done ./30s
hello
... замена echo
команда с более полезным уведомлением.
Это не дает вам никаких выходных данных исходной команды, но дает простой способ уведомить о завершении.
Если у вас еще нет сеанса, из которого вы запустили исходную команду, вам нужно собрать сценарий, чтобы следить за исчезновением процесса.
Для этого нет никакого встроенного способа. Однако я бы запустил только один лайнер, чтобы достичь того, что вам нужно.
Однако вам нужно знать свой идентификатор процесса bg (в вашем случае wget
). Ты мог бежать ps aux | grep wget
Когда у вас есть PID, вы можете использовать wait
. Однако это не сработает, если вы закрыли предыдущую оболочку или сеанс.
В этом случае я бы использовал ps -p PID
с while
loop to fire спит, пока процесс активен и после того, как процесс остановлен while
оператор заканчивается, и оболочка выполнит ваш sendmail
команда.
Полный код выглядит так:
while ps -p YOUR-PID > /dev/null; do sleep 1; done && echo "Subject: WGET DONE!" | sendmail user@domain.com
Резюме приведенного выше кода: пока выполняется выбранный вами процесс PID while
условие становится истинным и цикл продолжает выполняться sleep 1
и он проверяет его состояние каждую секунду. Однако если процесс завершится while
условие становится ложным, и цикл while завершается. И оболочка выполнит команду после &&, которая sendmail
Краткий ответ: нельзя.
Длинный ответ: вы можете попробовать прикрепить отладчик (strace, gdb) и получить таким образом свой вывод, а затем отправить эту информацию по почте. Но сначала вы получите другой формат вывода, а во-вторых, это много всего, но не очень полезно.