使用SSH在远程服务器上启动后台进程,然后退出会话

fut*_*ked 34 linux ssh remote-server nohup

我正在使用SSH在远程服务器上启动后台进程.这就是我现在所拥有的:

ssh remote_user@server.com"nohup process&"

这是有效的,因为这个过程确实开始了.但是在我点击Ctr-C之前,SSH会话本身并没有结束.

当我点击Ctr-C时,远程进程继续在后台运行.

我想将ssh命令放在我可以在本地运行的脚本中,所以我希望ssh会话在远程进程启动后自动退出.

有没有办法让这种情况发生?

Dou*_*las 48

ssh的"-f"选项告诉ssh在后台运行远程命令并立即返回.例如,

ssh -f user@host "echo foo; sleep 5; echo bar"
Run Code Online (Sandbox Code Playgroud)

如果您键入以上内容,您将立即返回shell提示符,然后您将看到"foo"输出.五秒钟后,您将看到"bar"输出.在此期间,您可能一直在使用shell.

  • 请注意,这将使您的SSH会话在后台运行.如果会话断开连接,命令将停止运行. (10认同)

Ron*_*son 26

使用时nohup,请确保您还重定向stdin,stdout和stderr:

ssh user@server 'DISPLAY=:0 nohup xeyes < /dev/null > std.out 2> std.err &'
Run Code Online (Sandbox Code Playgroud)

这样,您将完全脱离远程进程.小心使用,ssh -f user@host...因为这只会将ssh进程放在调用端的后台.您可以通过ps -aux | grep ssh在呼叫计算机上运行来验证这一点,这将显示ssh呼叫仍处于活动状态,但只是放在后台.

在我上面的例子中,我使用DISPLAY=:0xeyes是一个X11程序,我希望它在远程机器上启动.


小智 5

您可以使用screen在此屏幕上运行您的进程,从屏幕上分离Ctrl-a :detach并毫无问题地退出当前会话。然后您可以重新连接到 SSH 并再次附加到此屏幕以继续您的任务或检查是否已完成。

或者您可以将命令发送到已经运行的屏幕。您的本地脚本应如下所示:

ssh remote_user@server.com
screen -dmS new_screen sh
screen -S new_screen -p 0 -X stuff $'nohup process \n'
exit    
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参阅本教程