Команда зависит от завершения фонового задания

Я пытаюсь запустить фоновое задание, которое должно отправить электронное письмо после его завершения. Фоновое задание может выполняться несколько часов и должно выполняться независимо от оболочки, в которой оно было запущено (поскольку SSH отключится). В моем текущем сценарии ниже команда почты не ожидает завершения BACKGROUNDJOB. Как я могу этого добиться?

      nohup BACKGROUNDJOB -l $corefolder/$filename >/dev/nul 2> $corefolder/$filenameerr &
mail -s "JOB DONE" -A $corefolder/$filename -A $corefolder/$filenameerr abc123@gmail.com <<< "job finished on $HOSTENAME on $(date)"

К письму должны быть приложены 2 выходных файла из BACKGROUNDJOB, которые доступны только после его завершения.

      Or generally:
#Script.sh
Process 1 (e.g. run rsync) [this could take 10h and only then rsync.log is available]
Process 2 (send email with rsync.log as attachment)
#end script

И весь скрипт должен работать в фоновом режиме, чтобы работать независимо от оболочки и продолжать работать даже при отключении ssh.

1 ответ

... и должен работать независимо от оболочки, в которой он был запущен

Он не может работать независимо от оболочки, в которой он был запущен ... Ему нужна оболочка для интерпретации его команд до конца / выхода.

(потому что SSH отключится)

Отключение SSH приведет к отключению пользовательского терминала, что, в свою очередь, приведет кSIGHUP(зависание ) , и последний приведет к завершению работы оболочки, поскольку оболочка является просто дочерним процессом терминала родительского пользователя ... Вbash, вы можете указать своей оболочке игнорироватьSIGHUBсигнал со встроенным контролем заданияdisown

В моем текущем сценарии ниже команда почты не ожидает завершения BACKGROUNDJOB. Как я могу этого добиться?

Если вы вложите команды по порядку, напримерcomman1; command2; ...без отправки каких-либо предыдущих команд в фоновый режим, например, так:

      BACKGROUNDJOB -l $corefolder/$filename >/dev/nul 2> $corefolder/$filenameerr; mail -s "JOB DONE" -A $corefolder/$filename -A $corefolder/$filenameerr abc123@gmail.com <<< "job finished on $HOSTENAME on $(date)"

Затем последняя команда будет ждать, пока предыдущая команда завершит выполнение первой.

весь скрипт должен работать в фоновом режиме независимо от «оболочки» (вы имеете в виду родительский терминал ) и продолжать работать даже при отключении ssh.

Вы можете добиться этого так (синтаксис sub-shell здесь может быть не всегда нужен, но не вредит для использования во всех случаях ):

      (/path/to/scriptfile) & disown

Или, если вы предпочитаете вкладывать команды по порядку, например, так (синтаксис подоболочки (...)здесь нужно ):

      (BACKGROUNDJOB -l $corefolder/$filename >/dev/nul 2> $corefolder/$filenameerr; mail -s "JOB DONE" -A $corefolder/$filename -A $corefolder/$filenameerr abc123@gmail.com <<< "job finished on $HOSTENAME on $(date)") & disown
Другие вопросы по тегам