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

Posted

技术标签:

【中文标题】使用 SSH 在远程服务器上启动后台进程,并退出会话【英文标题】:Use SSH to start a background process on a remote server, and exit session 【发布时间】:2013-11-28 13:14:22 【问题描述】:

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

ssh remote_user@server.com "nohup 进程 &"

这行得通,因为该过程确实开始了。但是 SSH 会话本身直到我按下 Ctr-C 才会结束。

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

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

有没有办法做到这一点?

【问题讨论】:

【参考方案1】:

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

【讨论】:

有人这样想吗? ssh remote_user@server.com 'screen -S world/ -X stuff "nohup process "' 这些对我的问题不太有效,但我找到了另一篇与我的问题相匹配的文章:***.com/questions/29142/…【参考方案2】:

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

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

如果您输入上述内容,您将立即返回您的 shell 提示符,然后您将看到“foo”输出。五秒钟后,您将看到“bar”输出。与此同时,您可能一直在使用 shell。

【讨论】:

请注意,这将使您的 SSH 会话在后台运行。如果会话断开,命令将停止运行。【参考方案3】:

使用nohup 时,请确保您还重定向了标准输入、标准输出和标准错误:

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 程序,我希望它在 远程 机器上启动。

【讨论】:

它适用于我的分叉进程,如 '''rsync --daemon''' 否则不会退出 在执行期间 fork 脚本时,此方法非常有用。即使在我执行的脚本完成后,我的 ssh 也没有退出。我花了一整天的时间来解决它。谢谢你的回答【参考方案4】:

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

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

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

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

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

【讨论】:

以上是关于使用 SSH 在远程服务器上启动后台进程,并退出会话的主要内容,如果未能解决你的问题,请参考以下文章

linux-ssh远程后台执行脚本-放置后台执行问题(转)

如何使用 perl 和 Net::OpenSSH 在远程机器上启动后台进程?

[转载][整理]解决SSH退出登陆后保持进程继续在后台运行

如何在远程服务器上启动 NodeJS 进程?

为啥我退出 shell 时 unix 后台进程有时会死机?

linux进程永久放后台运行