Если вы хотите, чтобы скрипт контролировал вывод 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 части:
- просто выводит содержимое журнала в соответствии с запросом.
- контроль выхода, ищущего конкретную строку «STARTED»; если он найден,
kill
части 1 и 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», если оно еще не было.
Чтобы уточнить: вам нужна «командная строка», которая контролирует файл (log) в течение некоторого времени перед выходом и который выведет найденную строку в stdout и закроется, если найден. Нужно ли выходить в тайм-аут? – Floris
Я следил за вашей ссылкой. Что вам не понравилось в решении Тони К? Казалось, что он соответствует всем вашим критериям, поэтому я чего-то не хватает. – Floris
Работало ли мое обновленное решение? Мне любопытно ... :) – msb