Назад | Перейти на главную страницу

Редактировать команду отправить в фоновый режим

Можно ли отредактировать командную строку процесса, отправленного в фоновый режим, или связать другую команду для выполнения после выхода первой команды?

Например: я начинаю зеркалировать сайт с 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) и получить таким образом свой вывод, а затем отправить эту информацию по почте. Но сначала вы получите другой формат вывода, а во-вторых, это много всего, но не очень полезно.