Bash初始化脚本跳过if循环中的读取命令

时间:2018-11-23 00:32:33

标签: bash shell startup init rhel6

我正在尝试为bash中的程序创建一个初始化脚本。 (rhel6)

它首先检查进程。如果找到进程,它将回显该程序已经在线,如果没有找到,它将继续使用启动脚本以特定用户身份启动该程序。这样做之后,它应该尾随程序的日志文件,并一起检查字符串。如果找到这些单词,它应该杀死尾巴并回显该程序在线。

这是开始部分。

prog=someProg
user=someUser
threadCount=$(ps -ef | grep $prog |grep -v 'grep' |awk '{ print $2 }'| wc -l)

startb() {
  if [ "$threadCount" -eq 2 ]; then
    echo "$prog already online."
  else
    echo "Bringing $prog online."
    su $user -c "/path/to/start/script.sh"
    tail -f /path/to/$prog/log/file |
      while IFS=$'\n' read line
        do
          if [[ $line == *started\ up\ and\ registered\ in* ]]; then
            pkill tail
            echo "$prog now online."
          fi
        done
  fi
}

我的问题:

  1. $ threadcount 中未选择变量 $ prog 否 不管我怎么尝试。 (带单引号和双引号)
  2. 关于尾随日志文件的逻辑是随机工作的。有时候 完美地工作。它拖尾并等待直到找到字符串 在回显程序在线之前,有时它只是启动脚本 然后回显该程序是在线的,没有尾巴或等待。

这是不可预测的。我也在停止段中实现了相同的逻辑,以监视日志,然后进行回显,但即使这样也可以与启动相同。只是随机的。

我确定这看起来可能很愚蠢和破损。这是通过用我的初学者bash技能在这里和那里挑选碎片来完成的。

预先感谢您的建议和帮助。

1 个答案:

答案 0 :(得分:0)

对于“ grep $ prog”,我无法重现您遇到的错误...抱歉。

但另一方面。

  1. 我将假设以su行开头的脚本正在后台启动,并且脚本本身会结束。如果没有,您的示例将无限期等待。

  2. 可以是个人喜好,但是当我使用诸如tail之类的东西来验证行时,我使用了命名管道(mkfifo)。

那会给出类似的东西:

# Getting the tail in background
tail -f /path/to/$prog/log/file > some_fifo &
# Getting the tail PID
tailPID=$!

while read line; do #You don't need to modify/use IFS here.
     if [[ $line == *started\ up\ and\ registered\ in* ]]; then
           kill -15 $tailPID #since you know the PID you won't kill another tail
           echo "$prog now online."
           break # don't like the possibility, even remote, of an infinite loop :)
     fi
done < some_fifo #reading from the named pipe

希望它可以为您提供帮助