Answers:
SIGSTOP
并且SIGKILL
是不能被捕获,并通过一个过程来处理两个信号。SIGTSTP
就像SIGSTOP
不同的是它可以捕捉和处理。
该SIGSTOP
和SIGTSTP
在其轨道的信号停止一个进程,准备好SIGCONT
。当您发送该进程a时SIGTERM
,该进程未运行,因此无法运行代码以退出。
(还有SIGTTIN
和SIGTTOU
,这是TTY层在后台作业尝试读取或写入终端时由TTY层生成的信号。可以捕获它们,但是将停止(挂起)该过程,就像SIGTSTP
。但是,我现在要去忽略其余两个答案。)
您CtrlZ发送的进程a SIGTSTP
似乎并没有以任何方式进行特殊处理rsyslogd
,因此它只是挂起挂起的进程SIGCONT
或SIGKILL
。
这里的解决方案也是SIGCONT
在您之后发送,SIGTERM
以便进程可以接收和处理信号。
例:
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
我认为,GNU C库的文档很好地解释了这一点(重点介绍):
当一个过程停止时,除了
SIGKILL
信号和(显然)SIGCONT
信号之外,没有其他信号可以传递给它,直到继续执行为止。信号被标记为未决,但直到继续处理才交付。该SIGKILL
信号始终导致过程终止,并且不能被阻塞,处理或忽略。您可以忽略SIGCONT
,但是如果停止,它总是使该过程继续进行。向SIGCONT
过程发送信号会导致该过程的任何挂起的停止信号被丢弃。同样,SIGCONT
当进程接收到停止信号时,该进程的任何挂起信号都将被丢弃
SIGKILL
防止清除应用程序,因此SIGTERM
在许多(大多数)情况下使用更为可取。
SIGTERM
就像任何其他信号一样,它可以被进程捕获。接收信号只会使过程跳到特殊的信号处理程序例程。对于SIGTERM
默认操作,将终止该过程,但是例如,编辑者可能希望捕获信号,以便它可以在死亡之前保存所有打开文件的草稿副本。如果进程停止,则无法运行信号处理程序,但是信号将保持挂起状态,直到进程继续。请注意,通常不会保存发送的信号数量。
从理论上讲,系统可以知道进程是否为安装了信号处理程序SIGTERM
,如果没有,则立即终止。但是(根据Gilles的评论),POSIX要求信号将持续发送,直到通过继续该过程SIGCONT
。
kill -15
您已经发送的邮件”。