SIGSTOP
và SIGKILL
là hai tín hiệu không thể bị bắt và xử lý bởi một quá trình. SIGTSTP
giống như SIGSTOP
ngoại trừ việc nó có thể bị bắt và xử lý.
Các tín hiệu SIGSTOP
và SIGTSTP
dừng một quá trình trong các bài hát của nó, sẵn sàng cho SIGCONT
. Khi bạn gửi quy trình đó a SIGTERM
, quy trình không chạy và vì vậy nó không thể chạy mã để thoát.
(Ngoài ra còn có SIGTTIN
và SIGTTOU
, đó là các tín hiệu được tạo bởi lớp TTY khi một công việc nền cố gắng đọc hoặc ghi vào thiết bị đầu cuối. Chúng có thể bị bắt nhưng sẽ dừng lại (đình chỉ) quá trình, giống như SIGTSTP
. Nhưng bây giờ tôi sẽ đi bỏ qua hai phần còn lại của câu trả lời này.)
Của bạn CtrlZgửi quy trình a SIGTSTP
, dường như không được xử lý đặc biệt theo bất kỳ cách nào rsyslogd
, do đó, nó chỉ đơn giản là đình chỉ quá trình đang chờ xử lý SIGCONT
hoặc SIGKILL
.
Giải pháp ở đây cũng là gửi SIGCONT
sau của bạn SIGTERM
để quá trình có thể nhận và xử lý tín hiệu.
Thí dụ:
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
Tài liệu cho Thư viện GNU C giải thích điều này khá tốt, tôi nghĩ (phần nổi bật của tôi):
Trong khi một quá trình bị dừng lại, không có tín hiệu nào có thể được gửi đến nó cho đến khi nó được tiếp tục , ngoại trừ SIGKILL
tín hiệu và tín hiệu (rõ ràng) SIGCONT
. Các tín hiệu được đánh dấu là đang chờ xử lý, nhưng không được gửi cho đến khi quá trình được tiếp tục. Các SIGKILL
tín hiệu luôn luôn gây ra chấm dứt quá trình và không thể bị chặn, xử lý hoặc bỏ qua. Bạn có thể bỏ qua SIGCONT
, nhưng nó luôn khiến quá trình được tiếp tục dù thế nào nếu nó bị dừng lại. Gửi SIGCONT
tín hiệu đến một quy trình khiến mọi tín hiệu dừng đang chờ xử lý cho quá trình đó bị loại bỏ. Tương tự, mọi SIGCONT
tín hiệu đang chờ xử lý cho một quá trình sẽ bị loại bỏ khi nhận được tín hiệu dừng
kill -15
gì bạn đã gửi".