使用SSH远程启动进程


18

我编写了一个脚本,用于将新服务推入并部署到我控制的多台计算机上,并且为了执行该过程,我使用ssh远程启动该过程。不幸的是,每当我使用SSH启动该过程时,SSH命令似乎都不会返回,从而导致脚本停止运行。

该命令指定为:ssh $ user @ $ host“ / root / command&”。每当我运行简单的命令(例如ps或who)时,SSH命令都会立即返回,但是当我尝试启动进程时,它不会返回。我尝试过一些技巧,例如将我的流程包装在一个简单的bash脚本中,该脚本会启动该流程然后退出,但是这也会挂起SSH命令(即使bash脚本回显成功消息并正常退出)。

是否有人对导致这种行为的原因有任何见解,以及如何在启动过程后立即获得SSH命令以返回?

感谢您的见解!


发布您正在使用的确切命令行...省略密码/用户名/ IP
Joseph Kern 2009年

ssh $ SSH_USER @ $ HOST_ADDR“ / root / AppName&”
rmrobins,2009年

我应该提到我已经设置了SSH密钥,因此没有必要使用密码在远程系统上运行命令。
rmrobins

@rmrobins,这是一个非常好的步骤-设置公共密钥身份验证。
NIK

Answers:


28

SSH将远程外壳程序的stdin,stdout和stderr连接到本地终端,因此您可以与在远程端运行的命令进行交互。

副作用是,它将一直运行直到关闭这些连接为止,这仅在远程命令及其所有子代(!)终止时才会发生(因为子代(即“&”开头的子代)会从其子代继承std *父进程并保持打开状态)。

所以你需要使用类似

ssh user@host "/script/to/run < /dev/null > /tmp/mylogfile 2>&1 &"

<,>和2>&1将stdin / stdout / stderr重定向到远离终端的位置。然后,“&”使您的脚本进入后台。在生产中,您当然会将stdin / err重定向到合适的日志文件。

看到

http://osdir.com/ml/network.openssh.general/2006-05/msg00017.html

编辑:

刚刚发现< /dev/null上述内容不是必需的(但重定向stdout / err 必需的)。不知道为什么


谢谢,这正是我在寻找的东西-即使在使用&在后台启动它的过程中,我也没有想到该进程会继承std *。
rmrobins

+1!为我工作。您也可以通过回显日志文件来打印输出: ssh user@host "/script/to/run > /tmp/ssh.stdout 2>&1 && cat /tmp/ssh.stdout && rm -f /tmp/ssh.stdout"
Fishdrowned

5

您可以尝试nohup。Man nohup了解更多详细信息。

ssh host "nohup script &"

如果您想将输出保留在远程计算机上,这是一个变体

ssh user@host 'export REMOTE=myname; nice nohup ./my-restart >
logfile.log 2>&1 &'

5

另一种选择是启动一个独立的screen(1),类似于:

ssh -l user host "screen -d -m mycommand"

这将启动一个分离的屏幕(该屏幕捕获其中的所有交互),然后立即返回,终止ssh会话。

有了更多的独创性,您可以通过这种方式解决相当复杂的远程命令调用。


4
 -f      Requests ssh to go to background just before command execution.
         This is useful if ssh is going to ask for passwords or
         passphrases, but the user wants it in the background.  This
         implies -n.  The recommended way to start X11 programs at a
         remote site is with something like ssh -f host xterm.

         If the ExitOnForwardFailure configuration option is set to “yes”,
         then a client started with -f will wait for all remote port for‐
         wards to be successfully established before placing itself in the
         background.

1
这种方法的问题在于SSH命令实际上并未终止,只是隐藏在后台,因此运行脚本的主机在后台将有大量SSH命令从不返回,因为SSH命令从不返回(即,我想解决的根本问题)
rmrobins

-1

我认为正确的方法是

ssh user@host exec script.sh &

不,这对我不起作用。为什么要这样
sleske

我没有使用过ssh的背景推送功能,没有手头的尝试。我的错。
NIK
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.