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

时间:2013-11-15 07:52:48

标签: linux ssh remote-server nohup

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

  

ssh remote_user@server.com“nohup process&”

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

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

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

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

4 个答案:

答案 0 :(得分:45)

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

ssh -f user@host "echo foo; sleep 5; echo bar"

如果您输入上述内容,您将立即获得shell提示,然后您将看到" foo"输出。五秒钟后你会看到" bar"输出。与此同时,您可能一直在使用shell。

答案 1 :(得分:25)

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

ssh user@server 'DISPLAY=:0 nohup xeyes < /dev/null > std.out 2> std.err &'

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

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

答案 2 :(得分:4)

您可以使用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    

有关详细信息,请参阅此tutorial

答案 3 :(得分:0)

这个问题差不多有10年了,但是我最近不得不在远程服务器上启动一个很长的脚本(需要花费几个小时才能完成),我找到了使用crontab的方法。

如果可以在远程服务器上编辑用户的crontab,请使用ssh连接到服务器,编辑crontab并添加一个条目,该条目将在下一分钟启动您的脚本。假设是15h03。添加此行:

4 15 * * * /path/to/your/script.sh

保存您的crontab,请等待一分钟以启动脚本。然后再次编辑您的crontab以删除该条目。

然后您可以安全地退出ssh,甚至可以在脚本运行时关闭计算机。