Apa sebenarnya kill 0 lakukan? [Tutup]

22

Di man pagedalamnya tertulis:

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

Dan saya mencoba seperti ini di bash:

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

Di sini 0digunakan sebagai pid. Seperti yang saya pahami, kill 0akan membunuh semua proses dalam proses saat ini, yang termasuk pid15247. Namun, itu tidak melakukan apa pun dalam contoh ini. Adakah yang punya ide tentang cara menggunakannya?

Senjata api
sumber
Ini mengirimkan SIGTERMke proses, yang telah dilakukan. The manperintah telah memilih untuk mengabaikannya.
jordanm
5
@jordanm, tidak. pekerjaan yang dimulai oleh shell interaktif memiliki grup proses yang berbeda dari shell. Begitulah cara shell bisa meletakkannya di latar depan dan belakang. Lihat ps -juntuk melihat grup proses.
Stéphane Chazelas
1
Pertanyaan ini sebenarnya adalah salinan dari pertanyaan SuperUser. Apa sebenarnya kill 0 lakukan? (yang dimigrasikan dari StackOverflow). Lihat juga pertanyaan tentang kill -0(catatan dasbor), yang merupakan topik yang berbeda, di StackOverflow dan di sini di Unix.SE .
Adam Katz

Jawaban:

27

Seperti dikatakan, itu mengirimkan sinyal ke semua anggota grup proses pemanggil.

Kelompok proses digunakan untuk menerapkan kontrol pekerjaan di shell (mereka dapat digunakan untuk hal-hal lain, tetapi kontrol kerja shell interaktif adalah alasan utama keberadaan mereka).

Anda akan melihat bahwa ketika Anda mengetik Ctrl-C, semua proses pekerjaan saat ini terbunuh, tidak hanya yang memulai. Juga, itu tidak mematikan pekerjaan latar belakang.

Itu dicapai dengan kelompok proses. Pekerjaan adalah sekelompok proses yang dimulai oleh shell yang shell dapat letakkan di latar belakang atau latar depan (ditetapkan sebagai grup proses latar depan terminal atau tidak), dan membunuh secara keseluruhan.

Anda dapat mengetahui tentang id grup proses dan id sesi dengan ps -j( juntuk Jkontrol ob).

Untuk membunuh grup proses PGID $x, Anda lakukan:

kill -- "-$x"

kill 0 membunuh grup proses pemanggil.

Perhatikan bahwa jika Anda melakukannya /bin/kill 0:, shell akan memulai pekerjaan baru untuk mengeksekusi killperintah itu, jadi killhanya akan membunuh dirinya sendiri.

killbiasanya shell builtin, jadi killakan membunuh kelompok proses shell.

Namun, ketika shell bersifat interaktif, itu adalah proses yang mengelola grup proses, jadi biasanya tidak ada proses lain dalam grup proses shell. Semua proses yang dimulai oleh shell, berada di grup proses lain:

$ 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

Di atas, sleepdan psberada dalam dua grup proses yang berbeda, satu di latar belakang, satu di latar depan dan mereka berbeda dari grup proses shell.

Anda bisa melakukannya:

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

Shell interaktif akan memulai grup proses baru untuk subkulit itu, dan baik subkulit dan man (dan perintah lainnya dimulai oleh man seperti pager Anda, groff ...) akan berada di grup proses yang sama, jadi kill 0akan bekerja di sana. (di sleepatas adalah memberi waktu yang cukup bagi pager untuk memulai sehingga kita dapat melihatnya di ps -joutput sebelum kita membunuhnya).

Stéphane Chazelas
sumber
kill -- -$xsebenarnya mengatakan bash: kill: (-63531) - No such processdi bash 5.0.11 (1) - rilis di MacOS 10.14 tetapi prosesnya pasti ada dan berjalan. pkill -Pberfungsi dengan baik
kyb
1
@kyb $ x harus merupakan id grup proses, bukan id proses. Lihat hasil ps -juntuk mengetahui tentang pgids
Stéphane Chazelas