在 ssh 上执行长时间运行的命令

在 ssh 上执行长时间运行的命令

我正在ssh连接到一个服务器并启动一个 Python 脚本,该脚本大约需要 24 小时才能完成。如果我的互联网连接在中途中断了怎么办?这会停止命令吗?

有没有什么方法可以运行我的长时间运行的命令,使得本地断开连接不会影响它,并且我可以在ssh再次登录后继续看到它的输出?

答案1

最好的方法是使用screen(在服务器上)启动一个会话来运行命令,然后断开屏幕连接,以便它继续运行,您可以做其他事情,或者只是断开与服务器的连接。另一个选项是nohup与结合使用,&这样你就会有nohup <command> &

答案2

现有的答案可以很好地工作,但我需要一些 BusyBox(一个用于家用路由器等最小硬件的外壳和工具集)。我的系统没有screen、、、甚至!因此,感谢 SO 上的 tbc0 dtachatdisownnohup关联),我发现了这颗宝石。它立即返回,但服务器进程继续运行:

ssh myserver 'sleep 100 >&- 2>&- <&- &'

或者,如果需要多个命令:

ssh myserver '(echo one; sleep 100; echo two; sleep 200) >&- 2>&- <&- &'

解释:

  • >&-- 关闭标准输出句柄
  • 2>&-- 关闭 stderr
  • <&-- 关闭标准输入
  • &- 将进程置于后台

这不使用外部程序并且可以跨 ksh、ash、Bourne shell、bash 等工作。

答案3

如果您将一个进程置于后台并关闭会话,该进程将被 init(PID 1)采用。

如果我有一个会话并且执行:

]$ sleep 10000 &
]$ exit

打开另一个会话并运行:

]$ ps -ef | grep sleep
501      26387     1  0 16:37 ?        00:00:00 sleep 10000
root     26422 21360  0 16:40 pts/0    00:00:00 grep sleep

我的进程仍在运行,我们看到它的父进程现在是 1(init)。

或者,您可以像设置守护进程一样设置脚本。快速搜索后会找到这个看似有用的链接:http://onlamp.com/python/pythoncook2/solution.csp?day=1. 如果您想采取这种方法。

答案4

disown如果你已经开始了这个过程,screen你也可以使用nohup

相关内容