3

Чтобы максимально упростить ситуацию, скажем, я следил за файлом журнала, который вращается при завершении работы приложения. Поскольку файл изменяется, хвост останавливается. Для продолжения хвоста требуется прерывание клавиатуры, а затем команда запускается снова. Вот пример:

$ tail -f some-log-file.log
log line
log line
...etc...
log line
log line
Some app restarting...
^C
$ tail -f some-log-file.log
log line
log line
...etc...

Поэтому я хотел бы найти простой способ перезапустить хвост, когда встречается текст «Перезапуск некоторого приложения ...». Я думал о программах, которые я мог бы написать для мониторинга процессов или аналогичных, но я чувствую, что это должно быть возможно в виде однострочного или короткого сценария bash. Есть идеи?

1 ответ1

3
while true; do
  sed '/Some app restarting/q' <(exec tail -f some-log-file.log)
  kill -9 $!
done

Вот разбивка того, что это делает:

  • while true; do: начать бесконечный цикл
  • sed '/Some app restarting/q': отправляет свои входные данные на свой выход и завершает работу, когда появляется сообщение "Некоторое приложение перезапускается"
  • <(command): запустить команду в подоболочке в фоновом режиме и передать ее результат предыдущей команде
  • exec: замените (под) оболочку следующей командой, вместо того чтобы разветвляться для ее запуска
  • kill -9 $!: kill самый последний запущенный фоновый процесс, это tail -f (без этого он будет работать, но хвостовой процесс будет навсегда оставлен при каждом перезапуске приложения)
  • done: конец бесконечного цикла

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .