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