我有一个正在运行一些自定义软件的系统,然后可能会收到一个SIGHUP
. 作为 的结果SIGHUP
,该进程会进行一些清理并终止,但它不会终止其长时间运行的子进程。
在系统运行了几个月后(在此过程中,我的许多进程不幸被挂了),我可以在我的 Ubuntu 12.04 服务器中看到我有许多以 init 作为它们的子进程父母,但他们没有运行,也没有停止或僵尸 - ps 显示他们处于“睡眠”状态。
如果我尝试 strace 这些进程之一,该进程开始运行,然后立即看到它试图处理不再存在的文件(几个月前创建和删除的临时文件)并退出:
# 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>
(至少我猜是这样 - 在我发送信号后,进程消失了)。
知道发生了什么吗?
该过程可能已经接收到终端停止信号之一。如果后台进程尝试与终端通信,则可能会发送这些消息。有三种类型的终端停止信号:
TSTP
、TTIN
和TTOU
。我的第一个猜测是该进程在后台尝试从终端读取数据,因此发送了一个TTIN
信号。当您通过附加 strace 恢复它时,不再有终端,因此如果重试读取,它会收到错误代码而不是信号。解冻进程的另一种方法是向其发送CONT
信号。