Perbedaan antara sinyal kill yang kurang kuat -HUP (1) -INT (2) dan -TERM (15)

32

Terlepas dari yang paling kejam kill -9(SIGKILL), saya tidak begitu mengerti perbedaan antara 3 sinyal umum lainnya (di sini ) -HUP(1), -INT(2), dan -TERM(15).

Dalam skenario mana yang akan berhasil dan yang lainnya tidak?

Secara umum kapan -9( -KILL) gagal?

Bagi saya, mereka tampaknya meminta proses untuk mengakhiri dengan anggun , tanpa menabung . Nilai kerasnya, saya akan menempatkan -HUP < -TERM < -INT < -KILL.

Kenny
sumber
HUPtidak berarti program akan berhenti. Beberapa program digunakan SIGHUPuntuk memuat ulang file konfigurasi. SIGKILLgagal, atau lebih tepatnya ditunda, ketika proses dalam tidur tidak terputus .
muru

Jawaban:

52

SIGKILL tidak pernah gagal untuk membunuh proses yang sedang berjalan, itulah intinya. Sinyal lain ada untuk memberi aplikasi kesempatan untuk bereaksi.

Perilaku default SIGINT, SIGTERM, SIGQUIT dan SIGHUP adalah untuk mematikan program. Namun aplikasi diizinkan untuk menginstal handler untuk sinyal-sinyal ini. Jadi perilaku sebenarnya dari aplikasi ketika mereka menerima sinyal-sinyal ini adalah masalah konvensi (yang masing-masing aplikasi mungkin atau mungkin tidak mengikuti), bukan dari desain sistem.

SIGINT adalah yang terlemah. Arti konvensionalnya adalah "hentikan apa yang Anda lakukan sekarang dan tunggu input pengguna selanjutnya". Ini sinyal yang dihasilkan oleh Ctrl+ Cdi terminal. Program non-interaktif umumnya memperlakukannya seperti SIGTERM.

SIGTERM adalah sinyal pembunuh "normal". Ini memberitahu aplikasi untuk keluar dengan bersih. Aplikasi mungkin memerlukan waktu untuk menyelamatkan negaranya, untuk membebaskan sumber daya seperti file sementara yang seharusnya tetap tertinggal, dll. Aplikasi yang tidak ingin terganggu selama aplikasi kritis mungkin mengabaikan SIGTERM untuk sementara waktu.

SIGHUP hampir sama dengan SIGTERM dalam hal kekerasan, tetapi memiliki peran khusus karena secara otomatis dikirim ke aplikasi yang berjalan di terminal ketika pengguna terputus dari terminal itu (secara etimologis, karena pengguna terhubung melalui saluran telepon dan modem menutup telepon). SIGHUP seringkali tidak disengaja, tidak seperti SIGTERM yang harus dikirim secara eksplisit, jadi aplikasi harus mencoba menyelamatkan negara mereka di SIGHUP. SIGHUP juga memiliki arti konvensional yang sangat berbeda untuk aplikasi yang tidak menghadap pengguna ( daemon ), yaitu memuat ulang file konfigurasi mereka.

SIGQUIT adalah yang paling keras dari sinyal-sinyal yang dapat diabaikan. Ini dimaksudkan untuk digunakan ketika aplikasi mengalami kesalahan dan perlu dibunuh sekarang, dan secara default itu meninggalkan file dump inti (sistem modern di mana sebagian besar pengguna tidak tahu apa file inti cenderung tidak memproduksinya secara default) . Aplikasi dapat mengatur handler tetapi harus melakukan sangat sedikit (khususnya tidak menyimpan keadaan apa pun) karena maksud dari SIGQUIT adalah untuk digunakan ketika ada sesuatu yang salah.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
Bisakah Anda menguraikan lebih lanjut tentang "selamatkan negara mereka"? Jika saya dalam editor teks dan saya membunuhnya, saya kira kontennya tidak disimpan.
Kenny
2
@Kenny Kebanyakan editor tidak akan menyimpan file, karena Anda mungkin telah membuat modifikasi sementara yang tidak ingin Anda simpan. Editor tingkat lanjut (mis. Vi, emacs) memiliki file simpan otomatis tempat mereka menyimpan data dari waktu ke waktu; pada SIGHUP mereka biasanya akan memastikan bahwa file simpan otomatis up to date.
Gilles 'SANGAT berhenti menjadi jahat'