SIGSTOP
dan SIGKILL
merupakan dua sinyal yang tidak dapat ditangkap dan ditangani oleh suatu proses. SIGTSTP
seperti SIGSTOP
kecuali bahwa itu dapat ditangkap dan ditangani.
The SIGSTOP
dan SIGTSTP
sinyal menghentikan proses di jalurnya, siap SIGCONT
. Ketika Anda mengirim proses itu SIGTERM
, proses tidak berjalan dan sehingga tidak dapat menjalankan kode untuk keluar.
(Ada juga SIGTTIN
dan SIGTTOU
, yang merupakan sinyal yang dihasilkan oleh lapisan TTY ketika pekerjaan latar belakang mencoba membaca atau menulis ke terminal. Mereka dapat ditangkap tetapi sebaliknya akan menghentikan (menunda) proses, sama seperti SIGTSTP
. Tapi saya sekarang akan untuk mengabaikan keduanya untuk sisa jawaban ini.)
Anda CtrlZmengirimkan proses a SIGTSTP
, yang tampaknya tidak ditangani secara khusus dengan cara apa pun oleh rsyslogd
, jadi itu hanya menunda proses yang tertunda SIGCONT
atau SIGKILL
.
Solusi di sini adalah mengirim SIGCONT
setelah Anda SIGTERM
sehingga proses dapat menerima dan menangani sinyal.
Contoh:
sleep 999 &
# Assume we got PID 456 for this process
kill -TSTP 456 # Suspend the process (nicely)
kill -TERM 456 # Terminate the process (nicely). Nothing happens
kill -CONT 456 # Continue the process so it can exit cleanly
Dokumentasi untuk Perpustakaan C GNU menjelaskan ini dengan cukup baik, saya pikir (sorotan saya):
Ketika suatu proses dihentikan, tidak ada lagi sinyal yang dapat dikirim sampai diteruskan , kecuali SIGKILL
sinyal dan (jelas) SIGCONT
sinyal. Sinyal ditandai sebagai tertunda, tetapi tidak dikirimkan sampai proses dilanjutkan. The SIGKILL
sinyal selalu menyebabkan penghentian proses dan tidak dapat diblokir, ditangani atau diabaikan. Anda dapat mengabaikannya SIGCONT
, tetapi hal itu selalu menyebabkan proses dilanjutkan jika dihentikan. Mengirim SIGCONT
sinyal ke suatu proses menyebabkan sinyal berhenti yang tertunda untuk proses tersebut akan dibuang. Demikian juga, setiap SIGCONT
sinyal yang tertunda untuk suatu proses dibuang ketika menerima sinyal berhenti
kill -15
Anda sudah mengirim".