我已经编写了一个脚本,用于将一个新服务推送并部署到我控制的多台机器上,为了执行该过程,我使用ssh来远程启动该进程。 不幸的是,无论何时我使用SSH启动进程,SSH命令似乎都不会返回,导致脚本停顿。
该命令被指定为:ssh $ user @ $ host“/ root / command&”。 每当我运行简单的命令,比如ps或who,SSH命令立即返回,但是当我尝试启动我的进程时,它不会返回。 我尝试过一些简单的bash脚本来封装我的进程,然后退出,但是这也挂起了SSH命令(即使bash脚本回应成功消息,并且正常退出)。
有没有人对导致这种行为的原因有所了解,以及如何在启动进程后立即返回SSH命令?
感谢您的见解!
SSH将远程shell的stdin,stdout和stderr连接到本地terminal,因此您可以与在远程端运行的命令交互。
作为一个副作用,它将继续运行,直到这些连接已经closures,只有当远程命令及其所有子节点(!)已经终止时才会发生(因为子节点是“&”开始的,它们inheritance了std *父进程并保持打开状态)。
所以你需要使用类似的东西
ssh user@host "/script/to/run < /dev/null > /tmp/mylogfile 2>&1 &"
<,>和2>&1将stdin / stdout / stderrredirect到您的terminal。 “&”然后使您的脚本转到后台。 在生产中,你当然会将stdin / errredirect到合适的日志文件。
看到
http://osdir.com/ml/network.openssh.general/2006-05/msg00017.html
编辑:
刚刚发现上面的< /dev/null
没有必要(但redirectstdout / err 是 )。 不知道为什么…
另一种方法是启动一个独立的screen(1)
,例如:
ssh -l user host "screen -d -m mycommand"
这将启动一个分离的屏幕(捕获它内部的所有交互),然后立即返回,终止ssh会话。
用更巧妙的方式,你可以用这种方式解决相当复杂的远程命令调用。
-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.
你可以尝试一下。 男人nohup更多的细节。
ssh host "nohup script &"
如果你想保持远程机器的输出, 这里有一个变种 。
ssh user@host 'export REMOTE=myname; nice nohup ./my-restart > logfile.log 2>&1 &'
我认为正确的方法是
ssh user@host exec script.sh &