
Насколько я понимаю,рабочие места - это трубопроводызапущены из определенной оболочки, и вы можете управлять этими заданиями ( 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 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:~$