Що насправді вбиває 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. Однак у цьому прикладі це нічого не зробило. Хтось має ідеї, як ним користуватися?


Яку оболонку ви використовуєте?
FatalError

@FatalError Я використовую Bash
Firegun

Відповіді:


4

Я не зміг знайти примітки, як kill 0поводиться на моїй сторінці вбивства (debian).

Але у мене є два коментарі:

(1) "Група процесів" може бути не такою, яку ви очікуєте. Ви можете відобразити ідентифікатор групи процесів (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), розділ "SHELL BUILTIN COMMANDS") та зовнішній /bin/kill. Ці двоє можуть поводитися по-різному! Ви можете чітко вказати, який саме ви хочете запустити, ввівши builtin killабо command killзамість нього kill. Зовнішня команда , яку ви можете також запустити, вказавши шлях: /bin/kill.


1
PPIDє батьківським ідентифікатором процесу, який часто, але не обов'язково, ідентифікатор групи процесів. Правильний стовпець є PGID, який не відображається у psвихідному типі; вам потрібно скористатися -oопцією, щоб побудувати нестандартний формат, що включає його.
чепнер

@chepner: Ви абсолютно праві, дякую! Мене збентежила чоловіча сторінка Cygwin ps (1), в якій зазначається: "-l, --long: показувати утиліти процесу, ppids, pgids, winpids". Соромтесь, я відповідним чином відредагував свою відповідь. Однак моє твердження (лише людина + пейджер мають той самий PGID) зараз правильне, як і було призначено. (До того, як це рішення було неправильним :-()
mpy

1

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

kill -kill 0

Це посилає сигнал 9, сигнал SIGKILL, всім процесам, що мають ідентифікатор групи процесу, рівний ідентифікатору групи відправників. Оскільки оболонка не може ігнорувати сигнал SIGKILL, це також зупиняє оболонку входу та відключає вас

Це керівництво IBM AIX, але, можливо, ця концепція застосовується.

Ця функціональність не існує в Linux "kill" (як я бачу); але ось як поводиться "убивати":

Killing 0 не вбиває pid 0. Натомість це варіант в kill, щоб знищити всі процеси в поточній групі . Своєю командою ви вбиваєте все в ідентифікаційній групі процесів (GID) оболонки, яка видала команду kill.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.