当 SSH 会话丢失时,通过 SSH 写入标准输出的否认进程的行为是什么?

当 SSH 会话丢失时,通过 SSH 写入标准输出的否认进程的行为是什么?

我有一个处理 HTTP 请求的应用程序,它在处理请求时会将有关请求的某些信息打印到stdout。在这种情况下,我在后台运行该进程后,在该进程上运行了disown -hdisown。它仍然继续打印到stdout,这是预期的。此外,此过程是在 SSH 会话中启动的。假设我的互联网访问不稳定,在完成上述所有操作后,连接中断,而 SSH 并不知道发生了这种情况。当然,这需要几分钟时间,SSH 才会真正意识到连接已中断。

在此期间,应用程序在处理请求时开始遇到超时,直到 SSH 会话真正终止。这是由于涉及stdout当 PTY 不再存在时写入的缓冲问题吗?

答案1

disownSIGHUP当 SSH 退出时,将阻止您的应用程序接收信号。但是,如果应用程序随后写入已撤销的 pty,它将收到一个SIGPIPE信号。除非您正在处理或忽略SIGPIPE,否则它会默认终止您的应用程序。

如果应用程序确实进行了处理,SIGPIPE那么它的写入尝试将返回错误状态,然后由应用程序决定是否忽略错误、中止或执行其他操作。 (忽略错误很少是明智的。)

如果您只是想要最简单的方法来防止应用程序死亡,并且不想将其重定向到文件,请考虑在screen, 或内运行它tmux,或者使用mosh而不是ssh.

相关内容