В Bash 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