Terkadang ketika saya ingin logout dengan cepat saya lakukan kill -15 -1
. Saya perhatikan bahwa bash mengabaikan SIGTERM.
Aku bertanya-tanya apa alasan untuk perilaku bash seperti itu ?
Tidak terlalu UNIX untuk mengabaikan SIGTERM tanpa alasan yang bagus, bukan?
MEMPERBARUI:
efek yang sama (tidak) untuk semua:
$ kill -TERM $$
$ type kill
kill is a shell builtin
$ command kill -TERM $$
$ /bin/kill -TERM $$
UPDATE2:
Dari man bash :
Ketika bash bersifat interaktif, tanpa adanya perangkap, ia mengabaikan SIGTERM
Jadi itu dilakukan dengan sengaja. Tapi kenapa?
/bin/kill
atau shell builtin? Jika yang terakhir, saya menduga bahwa shell tidak akan bunuh diri dengan builtin sendiri.Jawaban:
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:
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 setelahset +m
) tidak membuat grup proses untuk perintah latar belakang. Jadi Anda dapat menggunakan perintahkill 0
untuk mematikan semua perintah latar belakang tanpa keluar. ² Dengan demikiankill 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 menjalankanpkill -t $TTY
ataupkill -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
ataulogout
), 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 menggunakannyakill -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, kemudiankill -123 -456 …
untuk membunuh grup proses.sumber
Ini mungkin menjawab pertanyaan Anda:
SUMBER : Manual Bash GNU
sumber