通过 SSH 运行 nohup 命令,然后断开连接

通过 SSH 运行 nohup 命令,然后断开连接

start.sh我想在运行以下命令的远程服务器上执行脚本:

nohup node server.js &

我天真地这样调用 SSH:

ssh myserver <<EOF
./start.sh &
EOF

这将启动脚本,但会话仍保持连接状态。我想使用脚本中的其他命令来执行此步骤,所以这不行。

我如何通过 SSH 连接到远程计算机,nohup在后台启动命令,然后断开连接?我想我可以将 SSH 进程本身放到后台,但这似乎不太合适。

答案1

您已经找到了正确的方法,这里有文档。

笔记:您可以通过在末尾放置一个 & 将 ssh(客户端)置于后台,但您将看不到输出。如果您确实想这样做,请将 stdout/stderr 重定向到一个文件,以防您需要检查来自远程主机的响应。

基本上你可以用以下任一方式进行:

直接运行命令{,s}

ssh user@host "nohup command1 > /dev/null 2>&1 &; nohup command2; command3"

或者

ssh user@host "$(nohup command1 > /dev/null 2>&1 &) && nohup command2 >> /path/to/log 2>&1 &"

笔记&&要求第一个命令返回 0,然后才能执行第二个命令

使用此处的文档

ssh user@host << EOF
nohup command1 > /dev/null 2>&1 &
nohup command2 >> /path/to/command2.log 2>&1 &
......
EOF

上述 3 个选项应该适合您。

另外,看一下这里的答案:https://askubuntu.com/a/348921/70270

答案2

ssh node "nohup sleep 10 &"

未以守护进程模式运行,保持 ssh 会话连接。尽管您使用了 nohup,ssh 会话仍将在 10 秒内返回。

原因是远程 stdout 和 stderr 仍连接到您的会话。它使 ssh 会话保持活动状态,nohup 不起作用。

这:

ssh node "nohup sleep 10 1>/dev/null 2>/dev/null &"

立即返回。它确实使用 nohup 启动远程进程并立即退出 ssh 会话。

答案3

为什么不直接用 tmux 或者 screen 来完成呢?例如:

$ tmux new -s SessionNameHere
$ nohup /path/to/your/script.sh

如果某件事会持续循环或需要一段时间才能完成,那么这种方法就很实用。您可以断开会话,但会话仍将保持活动状态。

答案4

最后但同样重要的是,切记不要为你的会话分配 tty。
如果你这样做,它将无法工作。

因此,如果您的命令中包含任何-t-tt-ttt等等。这就是它对您不起作用的原因。

因此,

ssh -tt host "(command 1; command 2; ...) &>/dev/null &"

使用

ssh host "(command 1; command 2; ...) &>/dev/null &"

相关内容