在后台运行脚本而不依赖于 shell

在后台运行脚本而不依赖于 shell

我想通过 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

您应该尝试在“屏幕“。

screen -D -m run1.sh

然后你可以通过以下方式观看屏幕:

screen -r

答案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,在哪里我几年前就发现了这一点。

相关内容