Di man page
dalamnya 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 0
digunakan sebagai pid
. Seperti yang saya pahami, kill 0
akan 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?
process
kill
process-groups
Senjata api
sumber
sumber
SIGTERM
ke proses, yang telah dilakukan. Theman
perintah telah memilih untuk mengabaikannya.ps -j
untuk melihat grup proses.kill -0
(catatan dasbor), yang merupakan topik yang berbeda, di StackOverflow dan di sini di Unix.SE .Jawaban:
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
(j
untuk Jkontrol ob).Untuk membunuh grup proses PGID
$x
, Anda lakukan:kill 0
membunuh grup proses pemanggil.Perhatikan bahwa jika Anda melakukannya
/bin/kill 0
:, shell akan memulai pekerjaan baru untuk mengeksekusikill
perintah itu, jadikill
hanya akan membunuh dirinya sendiri.kill
biasanya shell builtin, jadikill
akan 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:
Di atas,
sleep
danps
berada dalam dua grup proses yang berbeda, satu di latar belakang, satu di latar depan dan mereka berbeda dari grup proses shell.Anda bisa melakukannya:
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 0
akan bekerja di sana. (disleep
atas adalah memberi waktu yang cukup bagi pager untuk memulai sehingga kita dapat melihatnya dips -j
output sebelum kita membunuhnya).sumber
kill -- -$x
sebenarnya mengatakanbash: kill: (-63531) - No such process
di bash 5.0.11 (1) - rilis di MacOS 10.14 tetapi prosesnya pasti ada dan berjalan.pkill -P
berfungsi dengan baikps -j
untuk mengetahui tentang pgids