Проверьте команду disown

10

Я выпустил ^z; bg; disownпоследовательность, чтобы позволить мне закрыть сессию ssh, в которой я выполняю очень важный длительный процесс. Этот процесс записывает вывод состояния в stderr, и он продолжает делать это даже после отсоединения (проверено с помощью lsof, stderr fd открыт для чтения / записи).

Есть ли способ определить, что процесс действительно был отменен (не будет вызывать SIGHUP, если оболочка получает один)?

mikewaters
источник
1
Интересно, нужно ли это зайти на unix.stackexchange.com
Rilindo
2
Просто любопытно, почему бы и нет: $ PROCESS 1 >> / root / std.out 2 >> / root / err.out &
Эвери Пэйн

Ответы:

12

В Bash disownкоманда, выполненная сама по себе, удалит фоновые (через bgили &) процессы из активной таблицы заданий и пометит их как не получающие SIGHUP при выходе из системы.

Вы также можете передать одно или несколько заданий на отречение, например disown 1 3. Этот disown -hфлажок полезен, если вы хотите сохранить задания в таблице, но все же не SIGHUP при выходе из системы.

Вы можете просмотреть таблицу заданий, введя jobsкоманду. После успешного фона это покажет [1]+ command &. После отмены задания оно больше не должно отображаться в таблице заданий и больше не будет уничтожено при выходе из системы. Вы все еще можете просмотреть процесс с помощью ps ux, topи другой технологическим рассматривающим утилит.

После того как задание было отменено, вы можете дождаться его естественного завершения или отправить сигнал через killPID, чтобы остановить его.

Поскольку 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
lunixbochs
источник
1
+1 Информативно и с примерами. Приятно!
Энди Смит
Очень информативный комментарий; Вы говорите, что невозможно проверить отсоединение процесса (кроме того, что вы отметили, что его больше нет в таблице заданий)?
mikewaters
1
когда вы работаете detachна заднем плане, оно будет отсоединено :) На самом деле нет никакого среднего уровня там, где запуск его на заднем плане ничего не даст. проверка jobsтолько подтверждает, что вы не пытались отсоединить остановленный процесс или что-то еще.
lunixbochs