Что происходит с фоновыми заданиями после выхода из оболочки?

9

Из моего понимания, рабочие места трубопроводы начали с определенной оболочкой , и вы можете управлять этими заданиями ( fg, bg, Ctrl-Z) внутри этой оболочки. Задание может состоять из нескольких процессов / команд.

Мой вопрос: что происходит с этими заданиями, когда выходит оригинал, содержащий оболочку? Предположим, что huponexit не установлен, поэтому фоновые процессы продолжают работать после выхода из оболочки.

Предположим, я сделал:

$ run.sh | grep 'abc' &
[1] job_id

Затем я выхожу из этой оболочки. Я зайду в новую оболочку и побежу jobsи ничего не увижу явно Но я могу ps aux | grep run.shувидеть и запустить этот процесс, а также ps aux | grep grepпосмотреть и grep 'abc'запустить процесс .

Есть ли способ просто получить идентификатор задания для всего конвейера, чтобы я мог убить его за один раз, или мне нужно убить все процессы отдельно от другой оболочки, как только я выйду из исходной оболочки? (Я попробовал последнее, и это работает, но кажется, что хлопотно следить за всеми процессами.)

user2193268
источник

Ответы:

7

Когда оболочка выходит, она может отправлять сигнал HUP фоновым заданиям, и это может привести к их выходу. Сигнал SIGHUP отправляется только в том случае, если сама оболочка получает сигнал SIGHUP, т. Е. Только в том случае, если терминал отключается (например, из-за того, что процесс эмулятора терминала умирает), а не в том случае, если вы обычно выходите из оболочки (с помощью exitвстроенной функции или путем ввода Ctrl+ D). См. В каких случаях SIGHUP не отправляется на работу при выходе из системы? и есть ли какой-нибудь вариант UNIX, в котором дочерний процесс умирает со своим родителем? Больше подробностей. В bash вы также можете установить huponexitопцию отправки SIGHUP на фоновые задания при обычном выходе. В кш, баш и зш, звонюdisownна задании удаляет его из списка заданий для отправки на SIGHUP. Процесс, который получает SIGHUP, может игнорировать или перехватить сигнал, и тогда он не умрет. Использование nohupпри запуске программы делает ее невосприимчивой к SIGHUP.

Если процесс не прерван из-за возможного SIGHUP, он остается позади. Там нет ничего, чтобы связать это с номерами рабочих мест в оболочке.

Процесс может все еще умереть, если он пытается получить доступ к терминалу, но терминал больше не существует. Это зависит от того, как программа реагирует на несуществующий терминал.

Если задание содержит несколько процессов (например, конвейер), то все эти процессы находятся в одной группе процессов . Группы процессов были придуманы именно для того, чтобы охватить понятие задачи оболочки, состоящей из нескольких связанных процессов. Вы можете видеть процессы, сгруппированные по группам процессов, отображая их ID группы процессов (PGID - обычно это идентификатор процесса первого процесса в группе), например, ps lв Linux или что-то вроде ps -o pid,pgid,tty,etime,commпереносимого.

Вы можете убить все процессы в группе, передав отрицательный аргумент kill. Например, если вы определили, что PGID для конвейера, который вы хотите уничтожить, равен 1234, то вы можете уничтожить его с помощью

kill -TERM -1234
Жиль "ТАК - перестань быть злым"
источник
2

В общем, они все еще работают, но вы должны использовать nohup, если вы забыли или передумали использовать disown.

mike@mike-laptop4:~$ sleep 500
^Z
[1]+  Stopped                 sleep 500
mike@mike-laptop4:~$ bg
[1]+ sleep 500 &
mike@mike-laptop4:~$ jobs
[1]+  Running                 sleep 500 &
mike@mike-laptop4:~$ disown %1
mike@mike-laptop4:~$ jobs
mike@mike-laptop4:~$ 
mikejonesey
источник
и чтобы убить, вы можете проверить родительский bash с помощью ps -ef --forest, если bash имеет фоновые функции, вам может понадобиться также убить их
mikejonesey