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

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

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

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

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

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

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

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

решение1

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

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

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

Если задание содержит несколько процессов (например, конвейер), то все эти процессы находятся в одномгруппа процессов. Группы процессов были изобретены именно для того, чтобы захватить идею задания оболочки, состоящего из нескольких связанных процессов. Вы можете увидеть процессы, сгруппированные по группе процессов, отобразив их идентификатор группы процессов (PGID — обычно идентификатор процесса первого процесса в группе), например, под ps lLinux или что-то вроде того, как 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:~$ 

Связанный контент