Pertama, ini tidak spesifik untuk bash. ATT ksh, dash, dan zsh berperilaku sama: mereka mengabaikan SIGTERM dan SIGQUIT selama edisi baris perintah; Adapun mksh, itu juga tidak berhenti tetapi memperlakukan mereka seperti SIGINT.
Baik manual ksh dan manual bash membenarkan mengabaikan SIGTERM dalam istilah ini:
sehingga kill 0
tidak membunuh shell interaktif
kill 0
membunuh semua proses dalam grup proses di mana shell berada¹. Singkatnya, grup proses terdiri dari semua proses yang berjalan di latar depan pada terminal, atau semua proses di latar belakang atau pekerjaan yang ditangguhkan.
Lebih tepatnya, inilah yang terjadi pada cangkang modern dengan kontrol pekerjaan . Dalam shell seperti itu, kill 0
tidak akan berguna, karena shell akan berada dalam grup proses sendiri. Kerang yang lebih lama (atau kerang modern setelah set +m
) tidak membuat grup proses untuk perintah latar belakang. Jadi Anda dapat menggunakan perintah kill 0
untuk mematikan semua perintah latar belakang tanpa keluar. ² Dengan demikian kill 0
alasannya terlihat seperti yang lama yang tidak lagi dibenarkan saat ini tetapi disimpan untuk kompatibilitas mundur.
Namun ada situasi serupa lainnya di mana membuat shell kebal berguna. Pertimbangkan kasus di mana Anda memiliki proses memonopoli terminal dan Anda ingin membunuhnya tanpa keluar. Banyak sistem memiliki alat seperti pkill
yang memungkinkan Anda membunuh proses yang berjalan pada terminal. Anda dapat menjalankan pkill -t $TTY
atau pkill -QUIT -t $TTY
mematikan semua proses yang berjalan pada terminal saat ini, kecuali shell yang mengabaikan sinyal.
Sebuah shell biasanya hilang ketika pengguna keluar (dengan perintah seperti exit
atau logout
), atau ketika terminalnya menandakan akhir input (pengguna dapat menyebabkan ini dengan menekan Ctrl+ D) atau hilang sama sekali. Dalam kasus terakhir ini, shell menerima sinyal SIGHUP, dan shell tidak mengabaikan yang itu.
Untuk kasus penggunaan Anda keluar dari sesi X, kill -15 -1
akan melakukannya, karena itu membunuh emulator terminal yang menyebabkan shell menerima SIGHUP. Sebenarnya cukup untuk membunuh server X, tetapi itu membutuhkan menemukan ID prosesnya. Jika Anda ingin perintah yang sama berfungsi pada sesi teks, Anda dapat menggunakannya kill -15 -1; exit
. Lagipula itu perintah yang cukup berbahaya untuk dimiliki.
¹ Ini sepertinya tidak disebutkan dalam manual shell sebagai aturan; itu fitur panggilan sistem yang mendasarinya. Itu disebutkan secara eksplisit dalam spesifikasi POSIX .
² Saat ini, untuk melakukan itu, jalankan jobs -l
untuk melihat daftar pekerjaan dengan ID grup proses mereka, kemudian kill -123 -456 …
untuk membunuh grup proses.
/bin/kill
atau shell builtin? Jika yang terakhir, saya menduga bahwa shell tidak akan bunuh diri dengan builtin sendiri.