这是一个后续的问题,你如何使用ssh在一个shell脚本?的问题。如果我想在远程机器上执行在后台运行的命令,如何返回ssh命令?当我试图在命令末尾只包含&号时,它就挂起了。命令的确切形式如下所示:
ssh user@target "cd /some/directory; program-to-execute &"
什么好主意吗?需要注意的一件事是,登录到目标机器总是产生一个文本横幅,我设置了SSH密钥,所以不需要密码。
这是一个后续的问题,你如何使用ssh在一个shell脚本?的问题。如果我想在远程机器上执行在后台运行的命令,如何返回ssh命令?当我试图在命令末尾只包含&号时,它就挂起了。命令的确切形式如下所示:
ssh user@target "cd /some/directory; program-to-execute &"
什么好主意吗?需要注意的一件事是,登录到目标机器总是产生一个文本横幅,我设置了SSH密钥,所以不需要密码。
当前回答
对我来说,使用tmux new -d <shell cmd>语法进行远程tmux会话似乎非常方便:
ssh someone@elsewhere 'tmux new -d sleep 600'
这将在其他主机上启动新会话,本地机器上的ssh命令将几乎立即返回shell。然后您可以通过ssh连接到远程主机,并将tmux附加到该会话。注意,没有本地tmux运行,只有远程运行!
另外,如果你想让你的会话在任务完成后继续,只需在命令后添加一个shell启动器,但不要忘记用引号括起来:
ssh someone@elsewhere 'tmux new -d "~/myscript.sh; bash"'
其他回答
没有nohup你也可以做到:
ssh user@host 'myprogram >out.log 2>err.log &'
@cmcginty简洁的工作示例的后续内容,该示例还展示了如何用双引号替换外部命令。这是在PowerShell脚本中调用模板的样子(该脚本只能从双引号中插入变量,而忽略单引号中包装的任何变量展开):
ssh user@server "sh -c `"($cmd) &>/dev/null </dev/null &`""
内双引号用反标记而不是反斜杠进行转义。这允许$cmd由PowerShell脚本组成,例如用于部署脚本和自动化等。如果使用unix LF组合,$cmd甚至可以包含多行heredoc。
YOUR-COMMAND &> YOUR-LOG.log &
这应该运行该命令并分配一个进程id,您可以简单地跟踪-f YOUR-LOG.log以查看发生时写入该进程的结果。您可以在任何时候注销,这个过程将继续进行
对我来说,使用tmux new -d <shell cmd>语法进行远程tmux会话似乎非常方便:
ssh someone@elsewhere 'tmux new -d sleep 600'
这将在其他主机上启动新会话,本地机器上的ssh命令将几乎立即返回shell。然后您可以通过ssh连接到远程主机,并将tmux附加到该会话。注意,没有本地tmux运行,只有远程运行!
另外,如果你想让你的会话在任务完成后继续,只需在命令后添加一个shell启动器,但不要忘记用引号括起来:
ssh someone@elsewhere 'tmux new -d "~/myscript.sh; bash"'
我认为你必须把这些答案结合起来才能得到你想要的。如果将nohup与分号结合使用,并将整个内容用引号括起来,那么您将得到:
ssh user@target "cd /some/directory; nohup myprogram > foo.out 2> foo.err < /dev/null"
这似乎对我有用。使用nohup,您不需要将&附加到要运行的命令。此外,如果您不需要读取命令的任何输出,则可以使用
ssh user@target "cd /some/directory; nohup myprogram > /dev/null 2>&1"
将所有输出重定向到/dev/null