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


10

我正在ssh进入服务器,并且正在启动一个Python脚本,该脚本大约需要花费时间。24小时内即可完成。如果我的互联网连接在中间断开了怎么办?那会停止命令吗?

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

Answers:


29

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


屏幕。或者,您可以设置cron任务(如果多次执行则执行一次)。
至强

2
如果在屏幕上运行时断开连接,screen -r将重新连接您。
dpflug 2010年


2

现有的答案可以很好地工作,但是我需要BusyBox的东西(一个外壳和一组用于最小化硬件(如家庭路由器)的工具)。我的系统没有screendtachatdisown,甚至nohup!因此,感谢SO(link)上的tbc0 ,我找到了这个宝石。它立即返回,但是服务器进程继续运行:

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

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

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

说明:

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

它不使用任何外部程序,并且可以跨ksh,ash,Bourne shell,bash等运行。


1

如果您为进程提供背景并关闭会话,则该进程将被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(初始值)。

另外,您可以像设置守护程序一样设置脚本。快速搜索打开了这个看似有用的链接:http : //onlamp.com/python/pythoncook2/solution.csp?day=1。如果您想采用这种方法。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.