环境:centos7,语言:bash
如果我wasctl
从远程服务器调用,则ssh remote1 "./wasctl start"
在成功运行每个作业后它会永远挂起。
事实证明,尽管循环在后台运行,但我的 ssh 调用正在等待一段时间循环。
restartwas_启动.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
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 并仍然正常终止调用?
答案1
在 restartwas_start.sh 中:
6 nohup ./restartwas.sh &
做了:
6 nohup ./restartwas.sh < /dev/null >& XXXX &
这里 XXXX 可以是 /dev/null,在这种情况下您将不会获得 echo 输出。
或者 XXXX 可以是 /tmp/my_was_script.log 或类似内容,其中将捕获 echo 输出。
这应该可行。
问题是 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