Что на самом деле делает kill 0?

10

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

          0      All processes in the current process group are signaled

И я попробовал так:

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

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

Firegun
источник
Какую оболочку вы используете?
FatalError
@FatalError Я использую Bash
Firegun
Смотрите также Unix.SE клон этого вопроса .
Адам Кац

Ответы:

4

Я не смог найти заметку о том, как kill 0ведет себя на странице убийства (Debian).

Но у меня есть два комментария:

(1) «Группа процессов» может не соответствовать вашим ожиданиям. Вы можете отобразить ID группы процессов (PGID) с помощью ps -o "%p %P %r %c %a":

$ ps -o "%p %P %r %c %a"
  PID  PPID  PGID COMMAND         COMMAND
12124 12123 12124 zsh             -zsh
12212 12124 12212 man             man kill
12226 12212 12212 less            less
12302 12124 12302 ps              ps -o %p %P %r %c %a

Таким образом, manвместе с инструментом отображения пейджера ( less) находится в той же группе процессов, но это отличается от того из оболочки (zsh в моем случае).

(2) Вероятно, есть две разные killкоманды. Один встроенный bash(см. Bash (1), раздел «Команды, построенные оболочкой») и внешний /bin/kill. Эти двое могут вести себя по-разному! Вы можете явно указать, какой из них вы хотите запустить, набрав builtin killили command killвместо kill. Внешняя команда , которую вы можете также запустить, указав путь: /bin/kill.

МРУ
источник
1
PPIDявляется идентификатором родительского процесса, который часто, но не обязательно, идентификатором группы процессов. Правильный столбец PGID, который не отображается в psвыводе по умолчанию ; вам нужно использовать -oопцию для создания пользовательского формата, который включает его.
chepner
@chepner: Вы абсолютно правы, спасибо! Меня смутила страница справки моего Cygwin's ps (1), в которой говорится: «-l, --long: показать uid процесса, ppids, pgids, winpids». Позор мне, я отредактировал свой ответ соответственно. Однако мое утверждение (только человек + пейджер имеют одинаковый PGID) теперь правильно, как и предполагалось. (Еще до того, как это предложение было неверным :-()
mpy
1

Чтобы остановить все ваши процессы и выйти из системы, введите:

kill -kill 0

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

Это IBM AIX Manual, но, возможно, эта концепция применима.

Эта функциональность не существует в Linux "kill" (как я вижу); но вот как это "убивает" себя ведет

Killing 0 не убивает pid 0. Вместо этого это опция kill для уничтожения всех процессов в текущей группе . Своей командой вы убиваете все в идентификаторе группы процессов (GID) оболочки, которая выполнила команду kill.

Датчанин Балия
источник