环境:centos7,语言:bash
如果我wasctl
从远程服务器调用,ssh remote1 "./wasctl start"
它会在成功运行everyjob 后永远挂起。
事实证明,即使循环在后台运行,我的 ssh 调用也在等待一个 while 循环。
重启was_start.sh
1 #!/bin/sh
2 INTERVAL=10
3 LOG_TIME=`date +'%Y-%m-%d-%H:%M:%S'`
4 RESTARTWAS_PID=`ps -ef|grep "restartwas.sh"| grep -v grep|awk '{print $2}'`
5 if [ -z ${RESTARTWAS_PID} ]; then
6 nohup ./restartwas.sh &
7 fi
重启was.sh
1 #!/bin/sh
2 INTERVAL=5
3 while true
4 do
5 sleep $INTERVAL
6 LOG_TIME=`date +'%Y-%m-%d-%H:%M:%S'`
7 ONLINE_JAVA_PID=`ps -ef|grep java|grep "instance.name"|grep -v grep|awk '{print $2}'`
8 if [ -z ${ONLINE_JAVA_PID} ]; then
9 echo $LOG_TIME" was down"
10 echo $LOG_TIME" was restart start"
11 ./wasctl start
12 while true
13 do
14 START_JAVA_PID=`ps -ef|grep java|grep "instance.name"|grep -v grep|awk '{print $2}'`
15 if [ -n ${START_JAVA_PID} ]; then
16 break;
17 fi
18 sleep 1
19 done
20 echo $LOG_TIME" was restart stop"
21 fi
22 done
如果我不呼叫restartwas_start.sh
远程呼叫正常结束。
如何在后台运行循环 shell 并仍然正常终止呼叫?
在 restartwas_start.sh 中:
6 nohup ./restartwas.sh &
做了:
6 nohup ./restartwas.sh < /dev/null >& XXXX &
这里 XXXX 可以是 /dev/null,在这种情况下你不会得到回显输出。
或者 XXXX 可以是 /tmp/my_was_script.log 或类似的东西,其中将捕获回显输出。
这应该有效。
问题是 ssh 没有退出,因为由 nohup 启动的进程(restartwas.sh 和该脚本中的各种命令)仍在使用常见的 STDIN STDOUT 和 STDERR,而 ssh 正在等待这些进程的 EOF。
通过将这 3 个重定向到 /dev/null 或某个文件,我们确保 ssh 不会等待。
参考:
http ://www.snailbook.com/faq/background-jobs.auto.html
https://www.gnu.org/software/bash/manual/html_node/Redirections.html