Контроль файла, пока строка не найдена

Я использую хвост-f для контроля файла журнала, который активно пишется в. Когда определенная строка записана в файл журнала, я хочу выйти из контроля и продолжить остальную часть моего сценария.

В настоящее время я использую:

tail -f logfile.log | grep -m 1 "Server Started"

Когда строка найдена, grep выходы как ожидалось, но я должен найти способ сделать выход команды хвоста также так, чтобы сценарий мог продолжиться.

60
задан 13.04.2011, 23:38

3 ответа

Попытайтесь использовать inotify (inotifywait)

Вы настраиваете inotifywait для любого изменения файла, затем проверяете файл с grep, если не найденный просто повторно выполняет inotifywait, если найденный выходом цикл... Что-то как этот

0
ответ дан 07.12.2019, 08:18

Это будет немного хитро, так как необходимо будет войти в управление процессом и передачу сигналов. Больше kludgey было бы двумя решениями для сценария с помощью отслеживания PID. Лучше использовал бы именованные каналы как это.

Какой сценарий оболочки Вы используете?

Для быстрого и грязного, одного решения для сценария - я сделал бы сценарий жемчуга с помощью File:Tail

use File::Tail;
$file=File::Tail->new(name=>$name, maxinterval=>300, adjustafter=>7);
while (defined($line=$file->read)) {
    last if $line =~ /Server started/;
}

Так вместо того, чтобы печатать в цикле с условием продолжения, Вы могли отфильтровать для строки, соответствуют и убегают из цикла с условием продолжения, чтобы позволить Вашему сценарию продолжиться.

Любой из них должен включить просто немного обучения реализовать управление потоком наблюдения, которое Вы ищете.

4
ответ дан 07.12.2019, 08:18

Таким образом, после выполнения некоторого тестирования, я нашел быстрый способ с 1 строкой сделать эту работу. Кажется, что хвост-f выйдет, когда grep выйдет, но существует выгода. Это, кажется, только инициировано, если файл открыт и закрыт. Я выполнил это путем добавления пустой строки в файл, когда grep находит соответствие.

tail -f logfile |grep -m 1 "Server Started" | xargs echo "" >> logfile \;

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

Обоснуйте, что это закрывается, посмотрите на флаг-F, по сравнению с флагом-f.

6
ответ дан 07.12.2019, 08:18

Alex.

tail -f logfile |grep -m 1 "Server Started" | xargs echo "" >> /dev/null ;

эта команда никогда не выдаст запись в лог-файле, но будет тихо смазываться...

.
1
ответ дан 07.12.2019, 08:18

Теги

Похожие вопросы