我有一个在屏幕内运行的进程,我通过 ssh 连接到服务器以查看进程正在写入的内容。有时,当我连接并且没有手动断开连接时,进程会冻结并且几个小时不执行任何操作,直到我使用 ssh 和 screen -rd mysession 再次重新连接。我已经尝试使用 screen 记录发生了什么,但什么也没有出现:
ESC[32mMy **MaxMin: ***ESC[39m
ESC[32m***ESC[39m
虽然我的内部日志确实显示了时间差距:
[2021-02-23 03:29:12] middle.INFO: My ** MaxMin: ***
[2021-02-23 11:05:16] middle.INFO: ***
我已经尝试使用 nonblock on 和日志记录来找出发生了什么,但没有任何改善。有人对如何找出问题有更好的建议吗?我坚信它与屏幕有关,因为它发生在我睡觉的时候,所以有故障的 ssh 可能是罪魁祸首。但我仍然没有任何证据来支持这一点。我使用了很多内存和 CPU,但没有 8 小时的处理时间。在这种情况下,它也可能是具有长超时的网络调用,但我看到它在两次日志记录之间没有任何网络调用的情况下发生中断(我会同时检查我的超时)。
编辑:它可能是复制模式,但我无法有意复制它。
答案1
听起来好像 shell 在断开连接时阻塞了进程。如果进程处于前台,则会发生这种情况,因为进程将附加到 stdin/stdout,而屏幕将尝试保持连接有效。这可能导致进程阻塞。
当您失去连接时,前台进程将收到 SIGPIPE 信号。我假设屏幕将尝试屏蔽它,类似于 nohup 对 SIGHUP 所做的操作。
如果您不需要与该进程交互,请尝试使用 在屏幕的 shell 中将其作为后台进程运行&
。