我正在远程服务器上工作,在该服务器上使用 OpenFOAM 计算流体动力学库进行数值模拟。我构建了一系列 Python 脚本来自动化我的参数研究,它们似乎运行良好。
我使用 SSH 连接到服务器,并在交互式 shell 中启动脚本。有时,在我仍然无法识别的情况下,服务器会关闭 SSH 会话。我目前使用screen
窗口管理器作为解决方法,但对我来说仍然是一个问题。这是我得到的输出示例:
<lots of output before that>
Dumping up_half1 faces to "final_up_half1.obj"
Dumping cyclic match as lines between face centres to "final_up_half0up_half1_match.obj"
Writing repatched mesh to 0
End
Killing PID 32536
Connection to hpc4 closed by remote host.
Connection to hpc4 closed.
➜ ~
请注意,模拟尚未完成:在屏幕上打印的应用程序终止后End
,另一个应用程序应启动并执行一些处理。
那么问题来了:造成这种断线的原因是什么?
答案1
您可以使用 来避免服务器断开连接的问题nohup
。 nohup
在服务器上运行您的命令,即使服务器断开连接,它也会继续运行。它将命令的标准输出保存到名为 nohup.out 的文件中,但您可以根据需要重定向它。例如,
nohup ./simulation > output.txt &
将运行./simulation
并将通常打印到屏幕的输出放在output.txt中。即使 ssh 断开连接,./simulation
也会继续运行直至完成。
答案2
胡乱猜测:
您的机器没有任何问题,但您处于由防火墙“保护”的网络中,防火墙会跟踪 TCP 连接。当防火墙感觉你的连接闲置时间过长时,它会认为它已经死亡。这意味着防火墙认为转发属于该连接的 tcp 段不是一个好主意,因为从防火墙的角度来看,这些段可能不属于任何连接......并且您的 SSH 会话将最终超时。
为了纠正这种情况,您可以让 SSH 客户端时不时地发送一个空段,以提醒防火墙您在远程主机上有一个活动会话。您可以使用该ServerAliveInterval
选项来执行此操作,如所述这里。
当您使用屏幕时:我曾经遇到过同样的问题,但当我向我的硬状态行添加一个时钟时,我意外地修复了它,这使得屏幕每分钟自动更新硬状态行。
完成此任务的最少工作~/.screenrc
应该是:
hardstatus alwayslastline
hardstatus string '%=[%Y-%m-%d %c ]'
(采用自红帽杂志)