У меня есть CI-сервер с интерфейсом командной строки, который позволяет мне удаленно запускать задание ( jenkins
CI-сервер и jenkins-cli.jar
инструмент).
После того, как я запускаю работу, я веду tail -f
журнал (извините за грязную команду):
ssh -t my-jenkins-host.com "tail -f \"/var/lib/jenkins/jobs/$job_name/builds/\`ls -ltr /var/lib/jenkins/jobs/$job_name/builds/ | grep '^l' | tail -n 1|awk '{print \$9}'\`/log\""
После успешного завершения задания, обычно через 5 минут, я получаю следующую строку:
Finished: SUCCESS
Есть ли хороший способ прекратить бревно на этом этапе? т.е. есть ли tail_until 'some line' my-file.log
команда?
БОНУС: дополнительный кредит, если вы можете предоставить ответ, который возвращает 0, когда сопоставляется УСПЕХ, 1, когда сопоставляется ОТКАЗ, и ваше решение работает на Mac! (который, я считаю, основан на BSD)
q
команда принимает необязательный код выхода. Таким образом,sed
команда будетsed '/^Finished: SUCCESS$/ q0; /^Finished: FAILURE$/ q1'
Finished: SUCCESS
последняя строка вывода-q
, то есть тихий, выходит, как только находит совпадение-x
делаетgrep
соответствие всей линииДля второй части, попробуйте
-m <number>
говорит grep остановиться после совпадения чисели
grep -q
статус выхода будет только0
еслиSUCCESS
найден в конце строкиЕсли вы хотите увидеть все выходные данные, вы не можете использовать
grep -q
, но вы все равно можете сделатькоторый делает все, кроме установки состояния выхода на 1, если
FAILURE
появляется.источник
grep
Первоначально я использовал в своем ответе, но если он использует,tail -f
он, вероятно, хочет увидеть вывод файла;grep
не собирается показывать все промежуточные строкиВариант ответа @ Mikel с комментариями @ Mrozek (я бы ответил на комментарий, но думаю, что у меня пока недостаточно прав)
позволит вам использовать решение @ Mikel и по-прежнему видеть вывод на экране
источник
Мне не понравился ни один из ответов, поэтому я решил сделать свой собственный. Этот bash-скрипт отвечает всем критериям и включает БОНУС за выход 1 при ошибке.
Также включена функция тайм-аута, которая приведет к коду выхода 3. Если у вас нет команды timeout в вашей системе, возьмите скрипт timeout.sh от Энтони Тиссена:
http://www.ict.griffith.edu.au/anthony/software/timeout.sh
Согласно комментариям ниже, я обновил печать журнала, чтобы остановить расширение escape-символов, и включил все функции стандартного «чтения». См. Https://stackoverflow.com/a/10929511 для полной «прочитанной» информации. Проверка EOF здесь не требуется, но включена для полноты.
источник
while IFS= read -r LOGLINE
чтобы не допустить, чтобы оболочка выполняла разбиение пробелов в строкахtail
.read
не разделяется, когда есть только одна переменная (и это не массив с-a
), но вам нужно,-r
если входные данные содержат обратную косую черту. Но если входные данные содержат обратную косую черту, тоecho "$var"
могут также испортиться в зависимости от вашей оболочки и / или системы, так что лучшеprintf '%s\n' "$line"
Вот скрипт Python, который почти делает то, что я хочу (см. предостережения ниже):
предостережения:
строки не печатаются по мере их поступления ... они печатаются группами ... похоже, происходит некоторая буферизация
Я должен был бы установить это как скрипт на моем пути или что-то, так что это неудобно, и я бы предпочел гладкую однострочную :)
источник
tail
похоже, делает ту же самую буферизацию, так что я думаю, что это не то, что стоит пытаться обойти.У меня были проблемы с
sed
иgrep
и их варианты, поэтому я пишу своиone with bash conditions
источник
Вы также пытаетесь
источник