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


Він посилає SIGTERMпроцес, який він зробив. manКоманда вибрала його ігнорувати.
Йорданм

5
@jordanm, ні. робота, розпочата інтерактивною оболонкою, має іншу групу процесів, ніж оболонка. Ось так оболонка може поставити її на передній план та фон. Дивіться, ps -jщоб побачити групи процесів.
Стефан Шазелас

1
Це питання насправді є копією питання SuperUser Що насправді вбиває 0? (яка була перенесена з StackOverflow). Дивіться також питання kill -0(зверніть увагу на приладову), що інша тема, на StackOverflow і тут на Unix.SE .
Адам Кац

Відповіді:


27

Як йдеться в повідомленні, він посилає сигнал всім членам процесу групи абонента.

Групи процесів використовуються для здійснення управління роботою в оболонці (їх можна використовувати для інших речей, але інтерактивне управління роботою оболонки є основною причиною їх існування).

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

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

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

Щоб убити групу процесів 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)

Інтерактивна оболонка запустила б нову групу процесів для цієї підпакеті, і обидві підскладки і людина (а також інші команди, розпочаті людиною, як ваш пейджер, гроф ...) були б у тій самій групі процесів, і kill 0там працюватиме. ( sleepВище, щоб дати досить часу для пейджера , щоб почати , щоб ми могли бачити його в ps -jвиході , перш ніж вбити його).


kill -- -$xнасправді говорить bash: kill: (-63531) - No such processв bash 5.0.11 (1) -випуск на MacOS 10.14, але він впевнений, що процес існує і працює. pkill -Pпрацює чудово
киб

1
@kyb $ x має бути ідентифікатором групи процесів, а не ідентифікатором обробки. Дивіться вихід, ps -jщоб дізнатись про пгідів
Stéphane Chazelas,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.