Я выпустил ^z; bg; disown
последовательность, чтобы позволить мне закрыть сессию ssh, в которой я выполняю очень важный длительный процесс. Этот процесс записывает вывод состояния в stderr, и он продолжает делать это даже после отсоединения (проверено с помощью lsof, stderr fd открыт для чтения / записи).
Есть ли способ определить, что процесс действительно был отменен (не будет вызывать SIGHUP, если оболочка получает один)?
Ответы:
В Bash
disown
команда, выполненная сама по себе, удалит фоновые (черезbg
или&
) процессы из активной таблицы заданий и пометит их как не получающие SIGHUP при выходе из системы.Вы также можете передать одно или несколько заданий на отречение, например
disown 1 3
. Этотdisown -h
флажок полезен, если вы хотите сохранить задания в таблице, но все же не SIGHUP при выходе из системы.Вы можете просмотреть таблицу заданий, введя
jobs
команду. После успешного фона это покажет[1]+ command &
. После отмены задания оно больше не должно отображаться в таблице заданий и больше не будет уничтожено при выходе из системы. Вы все еще можете просмотреть процесс с помощьюps ux
,top
и другой технологическим рассматривающим утилит.После того как задание было отменено, вы можете дождаться его естественного завершения или отправить сигнал через
kill
PID, чтобы остановить его.Поскольку Bash просто удаляет задание из списка запущенных заданий, чтобы завершить его, а дескрипторы файла для stdout и stderr вашего терминала все еще открыты, вы продолжите получать выходные данные задания, пока ваше оконечное устройство не будет закрыто (когда вы выйдете из системы) ,
Примеры:
Я обычно использую только
disown
если я запускаю потенциально длительную команду, такую какrsync
или,cp
и после этого решаю, что мне нужно выйти из системы, не прерывая ее. Если вы знаете, что собираетесь запустить команду и выйти из системы, вы можете захватить вывод, отправив по трубопроводу илиtee
вставив его в файл, выполнив егоnohup
или запустив егоscreen
(что позволяет впоследствии вернуть себе команду / завершить ее) ).Примеры:
источник
detach
на заднем плане, оно будет отсоединено :) На самом деле нет никакого среднего уровня там, где запуск его на заднем плане ничего не даст. проверкаjobs
только подтверждает, что вы не пытались отсоединить остановленный процесс или что-то еще.