我使用SSH连接到我的AWS EC2实例并运行需要很长时间才能完成的代码。我发现,如果我的本地计算机休眠(或者即使我将其置于无人看管状态),SSH连接也会挂起(这本身并不致命),但这似乎终止了我使用SSH启动的EC2实例上的代码。
另外,我使用SSH来本地监视远程代码的异常,所以即使有一种方法告诉远程进程在SSH消失后保持活着,我仍然需要一种在本地看到输出的方法进程继续运行(没有SSH)。
SSH挂断后如何在我的AWS EC2实例上保持代码运行;如何监控此类流程的输出?
答案 0 :(得分:0)
当您关闭tty(在您的情况下为ssh close)时,您的进程将获得一个SIGHUP,并且SIGHUP上的默认操作将终止。为了避免这种情况,您可以使用命令nohup来捕获并且不将SIGHUP发送到您的命令,或者将SIGHUP捕获到您的代码中并忽略它。
有很多方法可以跟踪后台进程,但最简单的方法是将其写入文件,而在其他ssh中可以读取该文件。如果您的进程实际上是命令行上的命令,则可以将其标准输出和标准错误重定向到文件。当这样的文件不断获取新内容时,继续阅读它以刷新可能会很烦人,在这种情况下命令“tail -f”很方便。
答案 1 :(得分:0)
使用screen
local> ssh ...
remote> screen
remote+screen> python long_running.py ...
然后您可以从screen
分离,甚至与SSH断开连接,当您再次通过SSH重新登录时,您可以
remote> screen -r
重新连接到正在运行的代码。
答案 2 :(得分:0)
以下是如何配置ssh连接以保持活力:
vi ~/.ssh/config # on your client side
添加此行以每120秒发送一个“空数据包”:
ServerAliveInterval 120
如果您拥有服务器端,请执行类似的更改:
vi /etc/ssh/sshd_config
在配置文件底部添加这些行
ClientAliveInterval 120
ClientAliveCountMax 720
这是针对其他操作系统设置的Linux YMMV