![在后台运行脚本而不依赖于 shell](https://linux22.com/image/495247/%E5%9C%A8%E5%90%8E%E5%8F%B0%E8%BF%90%E8%A1%8C%E8%84%9A%E6%9C%AC%E8%80%8C%E4%B8%8D%E4%BE%9D%E8%B5%96%E4%BA%8E%20shell.png)
我想通过 ssh 远程运行一个 shell 脚本,并且脚本结束时 ssh shell 也应该结束。该脚本本身运行另一个脚本,该脚本的输出通过管道传输到日志文件。
例如:我运行脚本run1.sh:
#!/bin/sh
function logpipe() {
while read line;do
echo $line >> $1
done
}
./bin/run2.sh $JBOSS_HOSTNAME | logpipe $JBOSS_DIST/log/server.log 2>&1 &
运行2.sh:
#!/bin/sh
exec "$JAVA" -DJBOSS_PID=_$$_ $JAVA_OPTS \
-Djava.endorsed.dirs="$JBOSS_ENDORSED_DIRS" \
-classpath "$JBOSS_CLASSPATH" \
org.jboss.Main "$@"
现在的问题是当我跑步时
ssh myhost "bin/run1.sh"
shell 被“卡”在脚本上,我只能通过 Crtl+C 关闭它来松开它。我猜这个技巧是 nohup 和另一个管道技巧之间的某种技巧,但我现在无法做到。
答案1
答案2
问题是脚本实际上已经结束了,但是如果它让另一个程序连接到终端(通过将其置于后台),那么 SSH 仍然会保持连接。
使用nohup
只是让 shell 知道,如果外部实体正在发送挂断信号,则应该忽略它们,但实际上并没有断开程序与控制台的连接。
我不知道如何明确断开程序与终端的连接,但你可以做的一件事是使用以下命令向运行脚本的 SSH 会话发送 HUP 信号
kill -HUP $PPID
这将终止 SSH 连接并使程序保持运行,但调用 ssh 客户端将收到一条丑陋的“远程主机关闭连接”错误消息。
答案3
ssh myhost "nohup bin/run1.sh"
应该可以奏效。
答案4
除了上面提到的 ssh -t(我认为它会起作用)之外,您还应确保关闭所有脚本的输入和输出:
ssh myhost "bin/run1.sh > yourlog 2>&1 < /dev/null"
全部归功于 OpenSSH FAQ,在哪里我几年前就发现了这一点。