2013-04-12 2 views
2

Я пытаюсь улучшить скрипт службы (демон) для вывода вывода tomcat (при запуске с tty) до тех пор, пока приложение не будет эффективно запущено.Решение Unix для хвоста для ожидания определенной строки или выхода из таймаута

Приложения Tomcat могут занять до 10 минут, и очень полезно посмотреть, что произойдет.

Тем не менее, мы должны быть уверены, что этот сценарий запуска не будет работать бесконечно, если сообщение подтверждения запуска не появится в журналах.

Я знаю, что в Интернете полно подобных вопросов, но пока я не смог определить четкое решение, особенно то, что работает, не требуя утилит, которые недоступны по умолчанию.

Требования:

  1. запустить без необходимости устанавливать что-либо на недавнем Debian, Ubuntu, RedHat и OS X
  2. нет процессов, оставленных, когда он заканчивается (по любой причине)
  3. дисплей в Записан строки на стандартный вывод
  4. лог-файл доступен только для чтения, вы не можете потрогать
  5. лог-файл может быть повернута, не нарушая инструмент
  6. дополнительные престижность, если вы можете заставить его работать в одной строке

Выявленные проблемы до сих пор:

  • read -t не доступен на текущем Debian, Illegal option -t

Ссылки на частичных решений до сих пор:

+0

Чтобы уточнить: вам нужна «командная строка», которая контролирует файл (log) в течение некоторого времени перед выходом и который выведет найденную строку в stdout и закроется, если найден. Нужно ли выходить в тайм-аут? – Floris

+0

Я следил за вашей ссылкой. Что вам не понравилось в решении Тони К? Казалось, что он соответствует всем вашим критериям, поэтому я чего-то не хватает. – Floris

+1

Работало ли мое обновленное решение? Мне любопытно ... :) – msb

ответ

2

Если вы хотите, чтобы скрипт контролировал вывод tomcat, ожидающий определенной строки, ниже должно работать решение, и оно не использует read -t.

(tail -f server.log & ((tail -f server.log | grep -l STARTED && kill -9 `pstree -pa $$ | grep -E '\-(tail|sleep),' | sed 's/^[^0-9]*\([0-9]*\).*/\1/' | grep -vw $$ | xargs`) & sleep 900 && kill -9 `pstree -pa $$ | grep -E '\-(tail|sleep),' | sed 's/^[^0-9]*\([0-9]*\).*/\1/' | grep -vw $$ | xargs` && exit 3)) ; [ $? -eq 3 ] && echo 'server not up after 5 min' || echo 'server up' 

Он ищет строку "НАЧАТЬ" в файле журнала server.log, с таймаутом 15 минут (900 секунд). Я не уверен, что у вас есть в Debian. Вы должны иметь pstree, выход которого должен быть похож на:

$ pstree -pa 1803 
bash,1803 
    └─bash,7850 
     ├─bash,7852 
     │ ├─bash,7853 
     │ │ ├─grep,7856 --color=auto -l STARTED 
     │ │ └─tail,7855 -f server.log 
     │ └─sleep,7854 20 
     └─tail,7851 -f server.log 

Остальное я уверен, что вы должны иметь: kill, sed, sleep, grep, echo, xargs.

Некоторое объяснение того, что происходит. Эта строка содержит одну команду и окончательную оценку результатов команды для печати, если сервер встал или нет.Команда делится на 3 части:

  1. просто выводит содержимое журнала в соответствии с запросом.
  2. контроль выхода, ищущего конкретную строку «STARTED»; если он найден, kill части 1 и 3.
  3. ждать в течение 15 минут, и если 15 минут проходят, kill части 1 и 2, покидающие с кодом 3, чтобы сигнализировать к внешней оценке, что вся команда закончилась из-за тайм-аута.

С комментариями:

(tail -f server.log & # part 1 - just output the log content 
    (# part 2 
    (tail -f server.log | grep -l STARTED # search for the string 
    && kill -9 `pstree -pa $$ | grep -E '\-(tail|sleep),' | 
     sed 's/^[^0-9]*\([0-9]*\).*/\1/' | grep -vw $$ | 
     xargs` # if found, kill the remaining tails and sleeps 
    ) & # if the command ends in part 2, exit code is not 3 
    sleep 900 # part 3: sleep 15 minutes 
    && kill -9 `pstree -pa $$ | grep -E '\-(tail|sleep),' | 
       sed 's/^[^0-9]*\([0-9]*\).*/\1/' | grep -vw $$ | 
       xargs` # if time passed, kill the remaining tails and sleeps 
    && exit 3 # exit with code 3, so that the outside evaluation 
      # knows it ended by timeout 
) 
) ; # end of command; whenever it finishes, the evaluation below is executed, 
    # checking the exit code to print the appropriate message 
[ $? -eq 3 ] && echo 'server not up after 5 min' || echo 'server up' 

Обратите внимание, что из-за того, как работают bash трубы, если «НАЧАТЬ» строка найдена команда будет на самом деле только на выход и выводит сообщение "сервер вверх "после добавления дополнительной строки к server.log после строки с" STARTED ". Это потому, что, когда печатается строка «STARTED», grep найдет ее, распечатает свой выход и выйдет, закрыв вход. Однако соответствующий tail будет продолжать работать, пока у него не будет чего-то другого для записи; только тогда tail поймет, что его выход закрыт, а затем умрет, перейдя к команде kill, которая приведет к оценке. Нет никакого обходного пути к этому, AFAIK. Вы должны убедиться, что что-то напечатано в журнале после сообщения «STARTED», если оно еще не было.

+0

Я не уверен, что это работает, я попробовал, но я не видел выхода из журналов, я думаю, что что-то пошло не так. – sorin

+0

Команда ничего не выводит, пока в журналах не появится строка «НАЧАЛО», или время таймаута достигнуто. Он будет выводить только «сервер вверх», когда в файле журнала появляется строка «НАЧАЛО»; или он выведет «сервер не вверх через 5 минут», если прошло 5 минут, и строка не была замечена. Какой другой выход вы хотите? – msb

+0

Было бы здорово, если бы вы могли добавить версию, которая выводит журнал на stdout, чтобы вы могли видеть, что происходит. – sorin