Скрипт Bash init пропускает команды чтения в цикле if - PullRequest
0 голосов
/ 23 ноября 2018

Я пытаюсь создать скрипт инициализации для программы на 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. Переменная $ prog не выбирается в $ threadcount независимо от того, как я пытаюсь.(с одинарными и двойными кавычками)
  2. Логика создания файла журнала работает случайным образом.Иногда это просто отлично работает.Он подключается и ждет, пока строка не будет найдена, прежде чем эхо-программа будет подключена к сети, а иногда просто запускает сценарий, а затем выводит эхо-сообщение о том, что программа подключена к сети без хвоста или ожидания.

Это непредсказуемо.Я также реализовал ту же логику в сегменте остановки, чтобы отслеживать журнал и затем эхо, но даже это работает так же, как и запуск.Просто случайно.

Я уверен, что это может выглядеть глупо и сломано.Это можно сделать, собирая кусочки здесь и там с моими навыками новичка в bash.

Заранее спасибо за предложения и помощь.

1 Ответ

0 голосов
/ 23 ноября 2018

Я не могу воспроизвести ошибку, с которой вы столкнулись, с помощью "grep $ prog" ... извините.

Но для другой части.

  1. Iбудет предполагать, что скрипт, запускающий вашу программу, строка с 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

Надеюсь, это поможет вам

...