我编写了一个脚本,用于将新服务推送和部署到我控制的多台机器上,为了执行该过程,我使用 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是)。不知道为什么...
你可以试试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)
另一种选择是启动一个 detached screen(1),例如:
ssh -l user host "screen -d -m mycommand"
Run Code Online (Sandbox Code Playgroud)
这将启动一个分离的屏幕(捕获其中的所有交互),然后立即返回,终止 ssh 会话。
多一点独创性,您可以通过这种方式解决相当复杂的远程命令调用。