Я выпустил ^z; bg; disown
последовательность, чтобы позволить мне закрыть сеанс ssh, в котором я запускаю очень важный длительный процесс. Этот процесс записывает вывод состояния в stderr, и он продолжает делать это даже после отсоединения (проверено с помощью lsof, stderr fd открыт для r / w).
Есть ли способ определить, что процесс действительно был отклонен (SIGHUP не будет получен, если оболочка вернет его)?
В Баше disown
команда, выданная сама по себе, удалит фоновое заземление (через bg
или &
) из активной таблицы заданий и пометить их как не получающие SIGHUP при выходе из системы.
Вы также можете отказаться от одной или нескольких вакансий, например disown 1 3
. В disown -h
Флаг полезен, если вы хотите сохранить задания в таблице, но не SIGHUP при выходе из системы.
Вы можете просмотреть таблицу вакансий, выполнив jobs
команда. После успешного фона он покажет [1]+ command &
. После отказа от задания оно больше не должно отображаться в таблице заданий и больше не удаляться при выходе из системы. Вы все еще можете просмотреть процесс через ps ux
, top
и другие утилиты для просмотра процессов.
После того, как задание было отклонено, вы можете дождаться его естественного завершения или отправить сигнал через kill
к PID, чтобы остановить его.
Поскольку Bash просто удаляет задание из списка запущенных заданий для завершения, а дескрипторы файлов для stdout вашего терминала и stderr все еще открыты, вы продолжите получать выходные данные из задания, пока ваше терминальное устройство не будет закрыто (когда вы выйдете из системы) .
Примеры:
# we start a command in the background
$ cat /dev/urandom > test &
[1] 18533
# we see our command is still running
$ jobs
[1]+ Running cat /dev/urandom > test &
# we disown the backgrounded job
$ disown 1
# notice it is no longer in the job table
$ jobs
Я обычно использую только disown
если я запускаю потенциально длительную команду, например rsync
или cp
а затем решаю, что мне нужно выйти из системы, не прерывая ее. Если вы знаете, что собираетесь запустить команду и выйти из системы, вы можете записать вывод по конвейеру или tee
поместив его в файл, запустив его с nohup
, или запустить его в screen
(что позволяет вам снова получить право собственности на команду / завершить работу).
Примеры:
# capture stdout and stderr to separate logs
cat /dev/urandom >stdout.log 2>stderr.log
# capture stdout and stderr to the same log, and display to stdout as well
cat /dev/urandom 2>&1 | tee output.log
# run a command under nohup (doesn't require a disown or job control support)
nohup cat /dev/urandom </dev/null