Pada sistem POSIX, sinyal terminasi biasanya memiliki urutan berikut (menurut banyak halaman MAN dan Spec POSIX):
SIGTERM - dengan sopan meminta proses untuk dihentikan. Ini akan berakhir dengan anggun, membersihkan semua sumber daya (file, soket, proses anak, dll.), Menghapus file sementara dan sebagainya.
SIGQUIT - permintaan yang lebih kuat. Ini akan menghentikan ungraceful, masih membersihkan sumber daya yang benar-benar membutuhkan pembersihan, tapi mungkin tidak menghapus file sementara, mungkin menulis informasi debug di suatu tempat; pada beberapa sistem juga akan ditulis core dump (terlepas dari apakah sinyal ditangkap oleh aplikasi atau tidak).
SIGKILL - permintaan paling kuat. Proses tersebut bahkan tidak diminta untuk melakukan apapun, tetapi sistem akan membersihkan proses tersebut, apakah seperti itu atau tidak. Kemungkinan besar dump inti ditulis.
Bagaimana SIGINT cocok dengan gambaran itu? Proses CLI biasanya dihentikan oleh SIGINT ketika pengguna menekan CRTL + C, namun proses latar belakang juga dapat dihentikan oleh SIGINT menggunakan utilitas KILL. Apa yang tidak dapat saya lihat di spesifikasi atau file header adalah jika SIGINT lebih atau kurang kuat daripada SIGTERM atau jika ada perbedaan antara SIGINT dan SIGTERM sama sekali.
MEMPERBARUI:
Deskripsi terbaik tentang sinyal terminasi yang saya temukan sejauh ini ada di Dokumentasi GNU LibC . Ini menjelaskan dengan sangat baik bahwa ada perbedaan yang diinginkan antara SIGTERM dan SIGQUIT.
Dikatakan tentang SIGTERM:
Ini adalah cara normal untuk meminta penghentian program dengan sopan.
Dan dikatakan tentang SIGQUIT:
[...] dan menghasilkan core dump ketika menghentikan proses, seperti sinyal kesalahan program. Anda dapat menganggap ini sebagai kondisi kesalahan program yang “terdeteksi” oleh pengguna. [...] Jenis pembersihan tertentu sebaiknya diabaikan dalam menangani SIGQUIT. Misalnya, jika program membuat file sementara, program harus menangani permintaan penghentian lainnya dengan menghapus file sementara. Tetapi lebih baik bagi SIGQUIT untuk tidak menghapusnya, sehingga pengguna dapat memeriksanya sehubungan dengan core dump.
Dan SIGHUP juga dijelaskan dengan cukup baik. SIGHUP sebenarnya bukan sinyal penghentian, itu hanya berarti "koneksi" ke pengguna telah terputus, jadi aplikasi tidak dapat mengharapkan pengguna untuk membaca keluaran lebih lanjut (mis. Stdout / stderr output) dan tidak ada masukan yang diharapkan dari pengguna lagi. Untuk sebagian besar aplikasi, itu berarti lebih baik berhenti. Secara teori, aplikasi juga dapat memutuskan bahwa ia masuk ke mode daemon saat SIGHUP diterima dan sekarang berjalan sebagai proses latar belakang, menulis keluaran ke file log yang dikonfigurasi. Untuk kebanyakan daemon yang sudah berjalan di latar belakang, SIGHUP biasanya berarti bahwa mereka harus memeriksa ulang file konfigurasinya, jadi Anda mengirimkannya ke proses latar belakang setelah mengedit file konfigurasi.
Namun tidak ada penjelasan yang berguna tentang SIGINT di halaman ini, selain yang dikirimkan oleh CRTL + C. Apakah ada alasan mengapa seseorang menangani SIGINT dengan cara yang berbeda dari SIGTERM? Jika demikian alasan apa ini dan bagaimana penanganannya akan berbeda?
sudo fuser -l
di command prompt Anda. Bagi saya ini menunjukkan:HUP INT QUIT ILL TRAP ABRT IOT BUS FPE KILL USR1 SEGV USR2 PIPE ALRM TERM STKFLT CHLD CONT STOP TSTP TTIN TTOU URG XCPU XFSZ VTALRM PROF WINCH IO PWR SYS UNUSED
kill -l
daftar sinyal.Jawaban:
SIGTERM dan SIGKILL dimaksudkan untuk permintaan "hentikan proses ini" tujuan umum. SIGTERM (secara default) dan SIGKILL (selalu) akan menyebabkan penghentian proses. SIGTERM dapat ditangkap oleh proses (misalnya, sehingga dapat melakukan pembersihan sendiri jika diinginkan), atau bahkan diabaikan sepenuhnya; tetapi SIGKILL tidak dapat ditangkap atau diabaikan.
SIGINT dan SIGQUIT ditujukan khusus untuk permintaan dari terminal: karakter input tertentu dapat ditetapkan untuk menghasilkan sinyal ini (tergantung pada pengaturan kontrol terminal). Tindakan default untuk SIGINT adalah jenis penghentian proses yang sama sebagai tindakan default untuk SIGTERM dan tindakan yang tidak dapat diubah untuk SIGKILL; tindakan default untuk SIGQUIT juga penghentian proses, tetapi tindakan yang ditentukan implementasi tambahan mungkin terjadi, seperti pembuatan core dump. Entah dapat ditangkap atau diabaikan oleh proses jika diperlukan.
SIGHUP, seperti yang Anda katakan, dimaksudkan untuk menunjukkan bahwa koneksi terminal telah terputus, bukan sebagai sinyal terminasi. Tapi, sekali lagi, tindakan default untuk SIGHUP (jika proses tidak menangkap atau mengabaikannya) adalah menghentikan proses dengan cara yang sama seperti SIGTERM dll.
Ada tabel dalam definisi POSIX
signal.h
yang mencantumkan berbagai sinyal serta tindakan dan tujuan defaultnya, dan bab Antarmuka Terminal Umum menyertakan lebih banyak detail tentang sinyal yang berhubungan dengan terminal.sumber
Seperti yang dicatat DarkDust banyak sinyal memiliki hasil yang sama, tetapi proses dapat melampirkan tindakan yang berbeda dengan membedakan bagaimana setiap sinyal dihasilkan. Melihat kode sumber kernel FreeBSD (kern_sig.c) saya melihat bahwa dua sinyal ditangani dengan cara yang sama, mereka menghentikan proses dan dikirim ke utas apa pun.
sumber
man 7 signal
Ini adalah halaman manual non-normatif yang nyaman dari proyek halaman manual Linux yang sering ingin Anda lihat untuk informasi sinyal Linux.
Versi 3.22 menyebutkan hal-hal menarik seperti:
dan berisi tabel:
yang merangkum sinyal
Action
yang membedakan misalnya SIGQUIT dari SIGQUIT, karena SIGQUIT memiliki aksiCore
dan SIGINTTerm
.Tindakan tersebut didokumentasikan dalam dokumen yang sama:
Saya tidak dapat melihat perbedaan antara SIGTERM dan SIGINT dari sudut pandang kernel karena keduanya memiliki tindakan
Term
dan keduanya dapat ditangkap. Tampaknya itu hanya "perbedaan konvensi penggunaan umum":kill
Beberapa sinyal ANSI C dan lainnya tidak
Perbedaan yang mencolok adalah:
Mereka dijelaskan di bagian "7.14 Penanganan sinyal" dari draft C99 N1256 :
yang membuat SIGINT menjadi kandidat yang baik untuk Ctrl + C. interaktif
POSIX 7
POSIX 7 mendokumentasikan sinyal dengan
signal.h
header: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/signal.h.htmlHalaman ini juga memiliki tabel minat berikut yang menyebutkan beberapa hal yang telah kami lihat
man 7 signal
:BusyBox init
Perintah default BusyBox 1.29.2
reboot
mengirimkan SIGTERM ke proses, tidur sebentar, dan kemudian mengirim SIGKILL. Ini tampaknya menjadi konvensi umum di distro yang berbeda.Saat Anda mematikan sistem BusyBox dengan:
itu mengirimkan sinyal ke proses init.
Kemudian, penangan sinyal init akhirnya memanggil:
yang mencetak ke terminal:
Berikut adalah contoh konkret minimal dari itu .
Sinyal dikirim oleh kernel
sumber
Setelah pencarian Google cepat untuk sigint vs sigterm , sepertinya satu-satunya perbedaan yang dimaksudkan antara keduanya adalah apakah itu dimulai oleh pintasan keyboard atau dengan panggilan eksplisit ke
kill
.Hasilnya, Anda dapat, misalnya, mencegat sigint dan melakukan sesuatu yang istimewa dengannya, mengetahui bahwa kemungkinan besar dikirim melalui pintasan keyboard. Mungkin menyegarkan layar atau sesuatu, bukannya mati (tidak disarankan, karena orang berharap
^C
untuk mematikan program, hanya sebuah contoh).Saya juga belajar bahwa
^\
seharusnya mengirim sigquit, yang mungkin saya gunakan sendiri. Terlihat sangat berguna.sumber
Menggunakan
kill
(baik panggilan sistem dan utilitas` Anda dapat mengirim hampir semua sinyal ke proses apa pun, asalkan Anda sudah mendapat izin. Sebuah proses tidak dapat membedakan bagaimana sinyal menjadi hidup dan siapa yang mengirimnya.Yang sedang berkata, SIGINT benar-benar dimaksudkan untuk menyela interupsi Ctrl-C, sedangkan SIGTERM adalah sinyal terminal umum. Tidak ada konsep sinyal yang "lebih kuat", dengan pengecualian bahwa ada sinyal yang tidak dapat diblokir atau ditangani (SIGKILL dan SIGSTOP, menurut halaman manual).
Sebuah sinyal hanya bisa "lebih kuat" daripada sinyal lain sehubungan dengan bagaimana proses penerimaan menangani sinyal (dan apa tindakan default untuk sinyal itu). Misalnya, secara default, SIGTERM dan SIGINT mengarah ke penghentian. Tetapi jika Anda mengabaikan SIGTERM maka itu tidak akan menghentikan proses Anda, sementara SIGINT masih melakukannya.
sumber
Dengan pengecualian beberapa sinyal, penangan sinyal dapat menangkap berbagai sinyal, atau perilaku default setelah menerima sinyal dapat dimodifikasi. Lihat
signal(7)
halaman manual untuk detailnya.sumber
SIGINT
Sinyal (" program interrupt ") dikirim saat pengguna mengetik karakter INTR (biasanyaC-c
)." "SIGINT 2 Term Interrupt from keyboard" Anda menekan Ctrl-C,SIGINT
dikirim. Prosesnya biasanya mati. Apa lagi yang bisa diberikan?