我正在使用ssh在远程服务器上启动后台进程。这就是我现在拥有的:
ssh remote_user@server.com"nohup process &"
这是可行的,过程确实开始了。但在我点击ctr-c之前,ssh会话本身不会结束。
当我点击ctr-c时,远程进程继续在后台运行。
我想将ssh命令放在一个可以在本地运行的脚本中,所以我希望ssh会话在远程进程启动后自动退出。
有没有办法做到这一点?
ssh的"-f"选项告诉ssh在后台运行远程命令并立即返回。例如。,
ssh -f user@host"echo foo; sleep 5; echo bar"
如果您键入上述内容,将立即返回shell提示,然后将看到"foo"输出。5秒钟后,您将看到"bar"输出。与此同时,你可能已经在使用外壳了。
请注意,这将使您的ssh会话在后台运行。如果会话断开,命令将停止运行。
使用nohup时,请确保还重定向stdin、stdout和stderr:
ssh user@server 'DISPLAY=:0 nohup xeyes std.out 2> std.err &'
这样,您将完全脱离远程进程。小心使用ssh -f user@host...,因为这只会将ssh进程放在调用端的后台。您可以通过在调用机器上运行ps -aux | grep ssh来验证这一点,这将显示ssh调用仍然处于活动状态,但只是放在后台。
在上面的示例中,我使用DISPLAY=:0,因为xeyes是一个x11程序,我希望它在远程机器上启动。
它为我的工作,有一个分叉的进程,比如"rsync--daemon",否则不会退出。
当您在执行期间分叉脚本时,此方法非常好。即使在我执行的脚本完成之后,我的ssh也没有退出。我花了一整天的时间来解决这个问题。谢谢你的回答
您可以使用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
'
exit
有关更多信息,请参阅本教程
afaik你也可以用一个命令一次启动屏幕。
有人这样想?ssh remote_user@server.com 'screen -S world/ -X stuff"nohup process"'
这些对我的问题并不适用,但我找到了另一篇与我的问题相匹配的文章:stackoverflow.com/questions/29142/…