如何不期望远程 nohup 命令返回代码

如何不期望远程 nohup 命令返回代码

环境: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

相关内容