SIGTERM dan SIGKILL dimaksudkan untuk tujuan umum permintaan "hentikan proses ini". SIGTERM (secara default) dan SIGKILL (selalu) akan menyebabkan penghentian proses. SIGTERM mungkin tertangkap oleh proses (misalnya sehingga dapat melakukan pembersihan sendiri jika diinginkan), atau bahkan diabaikan sama sekali; tetapi SIGKILL tidak dapat ditangkap atau diabaikan.
SIGINT dan SIGQUIT dimaksudkan 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 dengan tindakan default untuk SIGTERM dan tindakan yang tidak dapat diubah untuk SIGKILL; tindakan default untuk SIGQUIT juga merupakan penghentian proses, tetapi tindakan tambahan yang ditentukan implementasi dapat terjadi, seperti pembuatan core dump. Keduanya dapat ditangkap atau diabaikan oleh proses jika diperlukan.
SIGHUP, seperti yang Anda katakan, dimaksudkan untuk menunjukkan bahwa koneksi terminal telah terputus, daripada menjadi sinyal terminasi seperti itu. Namun, 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 untuk signal.h
yang mencantumkan berbagai sinyal serta tindakan dan tujuan defaultnya, dan bab Antarmuka Terminal Umum mencakup lebih banyak detail tentang sinyal terkait terminal.
Seperti yang dicatat oleh DarkDust, banyak sinyal memiliki hasil yang sama, tetapi proses dapat melampirkan tindakan berbeda padanya dengan membedakan bagaimana setiap sinyal dihasilkan. Melihat kode sumber kernel FreeBSD (kern_sig.c), saya melihat bahwa kedua sinyal ditangani dengan cara yang sama, keduanya menghentikan proses dan dikirim ke utas apa pun.
SA_KILL|SA_PROC, /* SIGINT */
SA_KILL|SA_PROC, /* SIGTERM */
man 7 signal
Ini adalah halaman manual non-normatif dari proyek halaman manual Linux yang sering ingin Anda lihat untuk informasi sinyal Linux.
Versi 3.22 menyebutkan hal-hal menarik seperti:
Sinyal SIGKILL dan SIGSTOP tidak dapat ditangkap, diblokir, atau diabaikan.
dan berisi tabel:
Signal Value Action Comment
----------------------------------------------------------------------
SIGHUP 1 Term Hangup detected on controlling terminal
or death of controlling process
SIGINT 2 Term Interrupt from keyboard
SIGQUIT 3 Core Quit from keyboard
SIGILL 4 Core Illegal Instruction
SIGABRT 6 Core Abort signal from abort(3)
SIGFPE 8 Core Floating point exception
SIGKILL 9 Term Kill signal
SIGSEGV 11 Core Invalid memory reference
SIGPIPE 13 Term Broken pipe: write to pipe with no
readers
SIGALRM 14 Term Timer signal from alarm(2)
SIGTERM 15 Term Termination signal
SIGUSR1 30,10,16 Term User-defined signal 1
SIGUSR2 31,12,17 Term User-defined signal 2
SIGCHLD 20,17,18 Ign Child stopped or terminated
SIGCONT 19,18,25 Cont Continue if stopped
SIGSTOP 17,19,23 Stop Stop process
SIGTSTP 18,20,24 Stop Stop typed at tty
SIGTTIN 21,21,26 Stop tty input for background process
SIGTTOU 22,22,27 Stop tty output for background process
yang merangkum sinyal Action
yang membedakan misalnya SIGQUIT dari SIGQUIT, karena SIGQUIT memiliki aksi Core
dan SIGINT Term
.
Tindakan tersebut didokumentasikan dalam dokumen yang sama:
The entries in the "Action" column of the tables below specify the default disposition for each signal, as follows:
Term Default action is to terminate the process.
Ign Default action is to ignore the signal.
Core Default action is to terminate the process and dump core (see core(5)).
Stop Default action is to stop the process.
Cont Default action is to continue the process if it is currently stopped.
Saya tidak dapat melihat perbedaan apa pun antara SIGTERM dan SIGINT dari sudut pandang kernel karena keduanya memiliki aksi Term
dan keduanya dapat ditangkap. Tampaknya itu hanyalah "perbedaan konvensi penggunaan umum":
- SIGINT adalah apa yang terjadi saat Anda melakukan CTRL-C dari terminal
- SIGTERM adalah sinyal default yang dikirim oleh
kill
Beberapa sinyal adalah ANSI C dan lainnya tidak
Perbedaan yang cukup besar adalah:
- SIGINT dan SIGTERM adalah ANSI C, jadi lebih portabel
- SIGQUIT dan SIGKILL bukan
Mereka dijelaskan pada bagian "7.14 Penanganan sinyal " dari C99 draft N1256:
- SIGINT menerima sinyal perhatian interaktif
- SIGTERM permintaan penghentian dikirim ke program
yang menjadikan SIGINT kandidat yang baik untuk Ctrl + C interaktif.
POSIX 7
POSIX 7 mendokumentasikan sinyal dengan signal.h
tajuk:https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/signal.h.html
Halaman ini juga memiliki tabel minat berikut yang menyebutkan beberapa hal yang telah kita lihat di man 7 signal
:
Signal Default Action Description
SIGABRT A Process abort signal.
SIGALRM T Alarm clock.
SIGBUS A Access to an undefined portion of a memory object.
SIGCHLD I Child process terminated, stopped,
SIGCONT C Continue executing, if stopped.
SIGFPE A Erroneous arithmetic operation.
SIGHUP T Hangup.
SIGILL A Illegal instruction.
SIGINT T Terminal interrupt signal.
SIGKILL T Kill (cannot be caught or ignored).
SIGPIPE T Write on a pipe with no one to read it.
SIGQUIT A Terminal quit signal.
SIGSEGV A Invalid memory reference.
SIGSTOP S Stop executing (cannot be caught or ignored).
SIGTERM T Termination signal.
SIGTSTP S Terminal stop signal.
SIGTTIN S Background process attempting read.
SIGTTOU S Background process attempting write.
SIGUSR1 T User-defined signal 1.
SIGUSR2 T User-defined signal 2.
SIGTRAP A Trace/breakpoint trap.
SIGURG I High bandwidth data is available at a socket.
SIGXCPU A CPU time limit exceeded.
SIGXFSZ A File size limit exceeded.
init BusyBox
1.29.2 bawaan BusyBox reboot
perintah mengirim SIGTERM ke proses, tidur sebentar, lalu mengirim SIGKILL. Ini tampaknya menjadi konvensi umum di berbagai distro.
Saat Anda mematikan sistem BusyBox dengan:
reboot
itu mengirimkan sinyal ke proses init.
Kemudian, penangan sinyal init akhirnya memanggil:
static void run_shutdown_and_kill_processes(void)
{
/* Run everything to be run at "shutdown". This is done _prior_
* to killing everything, in case people wish to use scripts to
* shut things down gracefully... */
run_actions(SHUTDOWN);
message(L_CONSOLE | L_LOG, "The system is going down NOW!");
/* Send signals to every process _except_ pid 1 */
kill(-1, SIGTERM);
message(L_CONSOLE, "Sent SIG%s to all processes", "TERM");
sync();
sleep(1);
kill(-1, SIGKILL);
message(L_CONSOLE, "Sent SIG%s to all processes", "KILL");
sync();
/*sleep(1); - callers take care about making a pause */
}
yang mencetak ke terminal:
The system is going down NOW!
Sent SIGTERM to all processes
Sent SIGKILL to all processes
Berikut adalah contoh konkret minimalnya.
Sinyal yang dikirim oleh kernel
- SIGKILL:
- Pembunuh OOM:Apa itu RSS dan VSZ dalam manajemen memori Linux