У меня есть журнал сервера, который выводит определенную строку текста в свой файл журнала, когда сервер работает. Я хочу выполнить команду после запуска сервера и, следовательно, сделать что-то вроде следующего:
tail -f /path/to/serverLog | grep "server is up" ...(now, e.g., wget on server)?
Каков наилучший способ сделать это?
text-processing
shell-script
logs
tail
jonderry
источник
источник
tail -F
для обработки ротации журналов - то естьmy.log
становится полным и перемещается,my.log.1
и ваш процесс создает новыйmy.log
Ответы:
Простой способ был бы awk.
И да, оба являются реальными сообщениями из журнала ядра. Perl может быть немного более элегантным в использовании для этого и может также заменить необходимость в tail. Если использовать Perl, он будет выглядеть примерно так:
источник
awk
решение быть коротким и легко сделать на лету в одну строку. Однако, если команда, которую я хочу выполнить, имеет кавычки, это может быть немного громоздко, есть ли альтернатива, может быть, использование конвейеров и составных команд, которые также допускают краткое однострочное решение, но не требуют передачи результирующей команды как строка?system()
команды.tail -f /path/to/serverLog | grep "server is up" | head -1 && do_some_command
tail -n 0 -f /path/to/serverLog
что будет читать последние 0 строк файла, а затем ждать, пока будет напечатано больше строк.Если вы ищете только одну возможность и хотите оставаться в основном в оболочке вместо использования
awk
илиperl
, вы можете сделать что-то вроде:... который будет запускаться
my_command
каждый раз, когда " сервер включен " появляется в файле журнала. Для нескольких возможностей, вы можете отказаться отgrep
и вместо этого использоватьcase
внутриwhile
.Столица
-F
говоритtail
следить за тем, чтобы файл журнала вращался; т.е. если текущий файл будет переименован, а другой файл с таким же именем займет его место,tail
он переключится на новый файл.--line-buffered
Опция указываетgrep
промывать его буфер после каждой строки; в противном случае,my_command
может не быть достигнуто своевременно (при условии, что журналы имеют линии разумного размера).источник
--line-buffered
параметрgrep
или иным образом убедиться, что он сбрасывает вывод между строк: в противном случае он просто зависает иmy_command
никогда не достигается. Если вы предпочитаетеack
, у него есть--flush
флаг; если вы предпочитаетеag
, попробуйте обернуть сstdbuf
. stackoverflow.com/questions/28982518/…do exit ;
. Казалось, что он работает нормально, но tail никогда не заканчивался, и наш скрипт никогда не переходил на следующую строку. Есть ли способ остановить хвост вdo
разделе?На этот вопрос, похоже, уже дан ответ, но я думаю, что есть лучшее решение.
Вместо того, чтобы
tail | whatever
, я думаю, вы действительно хотитеswatch
. Swatch - это программа, разработанная специально для выполнения ваших задач, просмотра файла журнала и выполнения действий на основе строк журнала. Использованиеtail|foo
потребует, чтобы у вас был активно запущенный терминал для этого. Swatch, с другой стороны, работает как демон и всегда будет следить за вашими журналами. Swatch доступен во всех дистрибутивах Linux,Я призываю вас попробовать это. Хотя вы можете вбить гвоздь обратной стороной отвертки, это не значит, что вы должны это делать.
Лучший 30-секундный учебник по образцу, который я смог найти, находится здесь: http://www.campin.net/newlogcheck.html
источник
Странно, что никто не упомянул об
multitail
утилите, которая имеет эту функциональность из коробки. Один из примеров использования:Смотрите также другие примеры из
multitail
использования.источник
Bash может сделать работу сам
Давайте посмотрим, насколько просто и читабельно это может быть:
Пока вы не используете bash
regex
, это может остаться очень быстро!Но bash + sed - очень эффективный и интересный тандем
Но для сервера с высокой нагрузкой, и, как мне нравится,
sed
потому что он очень быстрый и очень масштабируемый, я часто использую это:источник
Вот так я и начал это делать, но стал более изощренным. Пара вещей, которые нужно учитывать:
Я использую что-то вроде этого:
Он работает, удерживая
tail
открытым, пока${RELEASE}
файл не содержит данных.Как только это
grep
удастся:${RELEASE}
который будет${wait_pid}
процесс, чтобыtail
Примечание:
sed
может быть более сложным, чтобы фактически определить количество строк, которыеtail
будут производиться при запуске, и удалить это число. Но в целом это 10.источник