当您./a.out
通过 SSH 在终端中运行时,SSH 会话超时,./a.out
就会被终止。为什么是这样?有人说是因为SIGHUP。但运行nohup ./a.out
仍然存在同样的问题,当SSH会话超时时,进程nohup ./a.out
仍然被杀死。
我看到有人说这是因为父母被杀时孩子也被杀了。但我在其他地方看到它声称通常情况并非如此。
另一种解释是 ./a.out 的标准输出与终端绑定。因此,在终端被杀死后,当./a.out尝试写入终端时,它将收到一个SIGPIPE,这将导致它被杀死。
nohup ./a.out
SSH超时死掉的真正原因是什么?
这是我正在运行的实际命令:nohup ./a.out |& tee logs.out
答案1
在您的情况下,tee logs.out
写入终端,并且当它在 SSH 连接关闭后尝试写入时将被终止。这反过来也会导致nohup
下次a.out
写入其标准输出时被杀死。
如果你想nohup ./a.out
生存,你应该在没有管道的情况下在后台运行它,并单独监视文件nohup.out
:
nohup ./a.out &
tail -f nohup.out
或者,使用您的日志文件,
nohup ./a.out > logs.out &
tail -f logs.out