我有一个处理 HTTP 请求的应用程序,它在处理请求时会将有关请求的某些信息打印到stdout
。在这种情况下,我在后台运行该进程后,在该进程上运行了disown -h
和disown
。它仍然继续打印到stdout
,这是预期的。此外,此过程是在 SSH 会话中启动的。假设我的互联网访问不稳定,在完成上述所有操作后,连接中断,而 SSH 并不知道发生了这种情况。当然,这需要几分钟时间,SSH 才会真正意识到连接已中断。
在此期间,应用程序在处理请求时开始遇到超时,直到 SSH 会话真正终止。这是由于涉及stdout
当 PTY 不再存在时写入的缓冲问题吗?
答案1
disown
SIGHUP
当 SSH 退出时,将阻止您的应用程序接收信号。但是,如果应用程序随后写入已撤销的 pty,它将收到一个SIGPIPE
信号。除非您正在处理或忽略SIGPIPE
,否则它会默认终止您的应用程序。
如果应用程序确实进行了处理,SIGPIPE
那么它的写入尝试将返回错误状态,然后由应用程序决定是否忽略错误、中止或执行其他操作。 (忽略错误很少是明智的。)
如果您只是想要最简单的方法来防止应用程序死亡,并且不想将其重定向到文件,请考虑在screen
, 或内运行它tmux
,或者使用mosh
而不是ssh
.