Что на самом деле делает kill 0? [закрыто]

22

В man pageней говорится:

kill [ -s signal | -p ] [ -a ] [ -- ] pid ...
 pid... Specify the list of processes that kill should signal.  Each pid can be one of five things:
          0      All processes in the current process group are signaled

И я попытался так в bash:

$ man kill &
[1] 15247
$
[1]+  Stopped                 man kill
$ kill 0
$ ps
15247 pts/41   00:00:00 man

Здесь 0используется как pid. Как я понял, kill 0будут убиты все процессы в текущем процессе, который включает в себя pid15247. Тем не менее, это ничего не сделало в этом примере. У кого-нибудь есть идеи о том, как его использовать?

Firegun
источник
Он отправляет SIGTERMпроцесс, который он сделал. Команда manрешила проигнорировать это.
Иордания
5
@jordanm, нет. задание, запущенное интерактивной оболочкой, имеет группу процессов, отличную от оболочки. Вот как оболочка может поместить его на передний план и фон. Смотрите, ps -jчтобы увидеть группы процессов.
Стефан Шазелас
1
Этот вопрос на самом деле является копией вопроса SuperUser Что на самом деле делает kill 0? (который был перенесен из StackOverflow). Смотрите также вопросы kill -0(обратите внимание на приборную), что другая тема, на StackOverflow и здесь на Unix.SE .
Адам Кац

Ответы:

27

Как он говорит, он посылает сигнал всем членам группы процессов вызывающей стороны.

Группы процессов используются для реализации управления заданиями в оболочке (они могут использоваться для других целей, но основной причиной их существования является интерактивное управление заданиями оболочки).

Вы заметите, что при вводе Ctrl-Cвсе процессы текущих заданий уничтожаются, а не только те, которые их запустили. Кроме того, это не убивает фоновые задания.

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

Вы можете узнать об идентификаторах групп процессов и идентификаторах сеансов с помощью ps -j( jдля Jконтроля ob).

Чтобы убить группу процессов PGID $x, вы делаете:

kill -- "-$x"

kill 0 убивает группу процессов вызывающей стороны.

Обратите внимание, что если вы сделаете:, /bin/kill 0оболочка запустит новое задание для выполнения этой killкоманды, поэтому killубьет только себя.

killобычно это встроенная оболочка, поэтому killубивает группу процессов оболочки.

Однако, когда оболочка является интерактивной, это процесс, управляющий группами процессов, поэтому обычно в группе процессов оболочки нет других процессов. Все процессы, запускаемые оболочкой, находятся в других группах процессов:

$ sleep 1000 &
[1] 22746
$ ps -j
  PID  PGID   SID TTY          TIME CMD
22735 22735 22735 pts/23   00:00:00 zsh
22746 22746 22735 pts/23   00:00:00 sleep
22749 22749 22735 pts/23   00:00:00 ps

Выше, sleepи psнаходятся в двух разных группах процессов, одна в фоновом режиме, одна на переднем плане, и они отличаются от группы процессов оболочки.

Вы могли бы сделать хотя:

(man kill & sleep 1; ps -j; kill 0)

Интерактивная оболочка запускает новую группу процессов для этого подоболочки, и и подоболочка, и команда man (и другие команды, запускаемые человеком, такие как ваш пейджер, groff ...) будут в одной группе процессов, поэтому kill 0будут работать там. ( sleepвышеприведенное - дать достаточно времени для запуска пейджера, чтобы мы могли увидеть его в ps -jвыводе, прежде чем убить его).

Стефан Шазелас
источник
kill -- -$xна самом деле говорит bash: kill: (-63531) - No such processв bash 5.0.11 (1) -релиз на MacOS 10.14, но он уверен, что процесс существует и работает. pkill -Pработает отлично
kyb
1
@kyb $ x должен быть идентификатором группы процессов, а не идентификатором процесса. Смотрите вывод, ps -jчтобы узнать о pgids
Стефан