使用 SSH 远程启动进程

rmr*_*ins 21 ssh command

我编写了一个脚本,用于将新服务推送和部署到我控制的多台机器上,为了执行该过程,我使用 ssh 远程启动该过程。

不幸的是,每当我使用 SSH 启动进程时,SSH 命令似乎永远不会返回,导致脚本停止。

该命令指定为:

ssh $user@$host "/root/command &"
Run Code Online (Sandbox Code Playgroud)

每当我运行简单的命令(例如 ps 或 who)时,SSH 命令都会立即返回,但是当我尝试启动我的进程时,它不会返回。

我尝试了一些技巧,比如将我的进程包装在一个简单的 bash 脚本中,该脚本启动进程然后退出,但是这也会挂起 SSH 命令(即使 bash 脚本回显成功消息并正常退出)。

有没有人知道是什么导致了这种行为,以及如何在进程开始后立即让 SSH 命令返回?

sle*_*ske 31

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

作为副作用,它会一直运行直到这些连接被关闭,这只会在远程命令及其所有子命令 (!)父进程并保持打开状态)。

所以你需要使用类似的东西

ssh user@host "/script/to/run < /dev/null > /tmp/mylogfile 2>&1 &"
Run Code Online (Sandbox Code Playgroud)

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

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

编辑:

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


Jau*_* Ho 7

你可以试试nohup。Man nohup 了解更多详情。

ssh host "nohup script &"
Run Code Online (Sandbox Code Playgroud)

如果你想在远程机器上保留输出,这里有一个变体

ssh user@host 'export REMOTE=myname; nice nohup ./my-restart >
logfile.log 2>&1 &'
Run Code Online (Sandbox Code Playgroud)


tow*_*owo 6

另一种选择是启动一个 detached screen(1),例如:

ssh -l user host "screen -d -m mycommand"
Run Code Online (Sandbox Code Playgroud)

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

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