Apa sebenarnya kill 0 lakukan?

10

Di man pagedalamnya tertulis:

          0      All processes in the current process group are signaled

Dan saya mencoba seperti ini:

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

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
Shell apa yang Anda gunakan?
FatalError
@FatalError Saya menggunakan Bash
Firegun
Lihat juga klon Unix.SE dari pertanyaan ini .
Adam Katz

Jawaban:

4

Saya tidak dapat menemukan catatan bagaimana kill 0berperilaku di halaman manual membunuh saya (debian).

Tapi saya punya dua komentar:

(1) "Grup Proses" mungkin tidak seperti yang Anda harapkan. Anda dapat menampilkan ID Grup Proses (PGID) dengan 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

Jadi, manbersama - sama dengan alat pager menampilkan ( less) berada di grup proses yang sama, tetapi itu berbeda dari shell (zsh dalam kasus saya).

(2) Mungkin ada dua killperintah yang berbeda . Satu dibangun ke bash(lihat bash (1), Bagian "SHELL BUILTIN PERINTAH") dan eksternal /bin/kill. Keduanya mungkin berperilaku berbeda! Anda dapat secara eksplisit menyatakan mana yang ingin Anda jalankan dengan mengetik builtin killatau command killalih-alih kill. Perintah eksternal Anda juga dapat menjalankan dengan menentukan jalan: /bin/kill.

mpy
sumber
1
PPIDadalah ID proses induk , yang sering, tetapi tidak harus, ID grup proses. Kolom yang benar adalah PGID, yang tidak muncul dalam psoutput default ; Anda perlu menggunakan -oopsi untuk membangun format khusus yang menyertakannya.
chepner
@ chepner: Anda benar sekali, terima kasih! Saya bingung dengan halaman manual ps (1) Cygwin saya, yang menyatakan: "-l, --long: tampilkan proses uids, ppid, pgids, winpids". Malu pada saya, saya mengedit jawaban saya sesuai. Namun, pernyataan saya (hanya man + pager yang memiliki PGID yang sama) benar sekarang, sebagaimana dimaksud. (Bahkan sebelum kalimat itu salah :-()
mpy
1

Untuk menghentikan semua proses Anda dan keluar, masukkan:

kill -kill 0

Ini mengirimkan sinyal 9, sinyal SIGKILL, ke semua proses yang memiliki ID grup proses sama dengan ID grup proses pengirim. Karena shell tidak dapat mengabaikan sinyal SIGKILL, shell ini juga menghentikan shell login dan membuat Anda log off

Ini adalah AIX Manual IBM, tetapi mungkin konsepnya berlaku.

Fungsi ini tidak ada di Linux "kill" (seperti yang saya lihat); tapi begitulah perilaku "membunuh":

Membunuh 0 tidak membunuh pid 0. Alih-alih itu adalah opsi dalam kill untuk membunuh semua proses dalam grup saat ini . Dengan perintah Anda, Anda membunuh semua yang ada di ID grup proses (GID) dari shell yang mengeluarkan perintah kill.

Dane Balia
sumber