SIGSTOPdan SIGKILLmerupakan dua sinyal yang tidak dapat ditangkap dan ditangani oleh suatu proses. SIGTSTPseperti SIGSTOPkecuali bahwa itu dapat ditangkap dan ditangani.
The SIGSTOPdan SIGTSTPsinyal 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 SIGTTINdan 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 SIGCONTatau SIGKILL.
Solusi di sini adalah mengirim SIGCONTsetelah Anda SIGTERMsehingga 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 SIGKILLsinyal dan (jelas) SIGCONTsinyal. Sinyal ditandai sebagai tertunda, tetapi tidak dikirimkan sampai proses dilanjutkan. The SIGKILLsinyal 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 SIGCONTsinyal ke suatu proses menyebabkan sinyal berhenti yang tertunda untuk proses tersebut akan dibuang. Demikian juga, setiap SIGCONTsinyal yang tertunda untuk suatu proses dibuang ketika menerima sinyal berhenti
kill -15Anda sudah mengirim".