在不粘壳的情况下在后台运行脚本

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

run2.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 + Cclosures它。 我猜这个诀窍是nohup和另一个pipe道技巧之间的事情,但现在我还没有办法。

你应该尝试在“ 屏幕 ”上运行你的脚本。

 screen -D -m run1.sh 

然后你可以赶上屏幕:

 screen -r 

问题是,脚本实际上结束了,但如果它留下另一个程序连接到terminal(通过后台),然后SSH仍然保持连接连接。

使用nohup只是简单地让shell知道如果一个外部实体发送挂断信号,它们应该被忽略,但是它实际上并没有从控制台断开程序。

我不知道明确地从terminal断开一个程序,但你可以做的一件事是发送一个HUP信号到SSH会话,使用命令运行脚本

 kill -HUP $PPID 

这将终止SSH连接,并将使程序运行,但调用SSH客户端将得到一个丑陋的“由远程主机closures的连接”错误消息。

 ssh myhost "nohup bin/run1.sh" 

应该做的伎俩。

我相信你对nohup是正确的。 在run1.sh中,尝试将最后一行更改为:

 nohup ./bin/run2.sh $JBOSS_HOSTNAME | logpipe $JBOSS_DIST/log/server.log 2>&1 & 

除了上面提到的ssh-t之外,我认为可以工作,您应该确保closures所有脚本的input和输出:

 ssh myhost "bin/run1.sh > yourlog 2>&1 < /dev/null" 

所有信贷的OpenSSH常见问题,我发现这几年前。

如果run1.sh源run2.sh会发生什么情况?

 . ./bin/run2.sh $JBOSS_HOSTNAME | logpipe $JBOSS_DIST/log/server.log 2>&1 & 

这是最可能的文件描述符FD> 2仍然是开放的。 用lsof检查。