我正在ssh
连接到一个服务器并启动一个 Python 脚本,该脚本大约需要 24 小时才能完成。如果我的互联网连接在中途中断了怎么办?这会停止命令吗?
有没有什么方法可以运行我的长时间运行的命令,使得本地断开连接不会影响它,并且我可以在ssh
再次登录后继续看到它的输出?
答案1
最好的方法是使用screen
(在服务器上)启动一个会话来运行命令,然后断开屏幕连接,以便它继续运行,您可以做其他事情,或者只是断开与服务器的连接。另一个选项是nohup
与结合使用,&
这样你就会有nohup <command> &
答案2
现有的答案可以很好地工作,但我需要一些 BusyBox(一个用于家用路由器等最小硬件的外壳和工具集)。我的系统没有screen
、、、甚至!因此,感谢 SO 上的 tbc0 dtach
(at
disown
nohup
关联),我发现了这颗宝石。它立即返回,但服务器进程继续运行:
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