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 &"