我有一个系统,其中运行着一些自定义软件,然后可能会收到SIGHUP
。 结果是SIGHUP
,该进程会进行一些清理并终止,但不会终止其长时间运行的子进程。
在系统运行了几个月之后(在此期间我的许多进程不幸被挂起了),我可以在我的 Ubuntu 12.04 服务器中看到,我有许多以 init 作为其父进程的子进程,但它们没有运行,也没有停止或处于僵尸状态 - ps 显示它们处于“睡眠”状态。
如果我尝试跟踪其中一个进程,该进程开始运行,然后立即发现它正在尝试处理不再存在的文件(几个月前创建和删除的临时文件)并退出:
# strace -fp 16111
Process 16111 attached - interrupt to quit
open("/tmp/some-file", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
write(2, "/tmp/some-file:"..., 59) = 59
close(3) = 0
exit_group(1) = ?
Process 16111 detached
如果我尝试,也会发生这种情况kill -STOP <pid>
(至少我猜测会发生这种情况 - 在我发送信号后,该过程就消失了)。
知道发生什么事了吗?
答案1
进程可能已收到终端停止信号之一。如果后台进程尝试与终端通信,则可能会发送这些信号。终端停止信号有三种类型:TSTP
、TTIN
和TTOU
。我的第一个猜测是进程在后台运行时尝试从终端读取,因此发送了信号TTIN
。当您通过附加 strace 恢复它时,不再有终端,因此如果重试读取,它会收到错误代码而不是信号。解冻进程的另一种方法是向其发送信号CONT
。