Я использую хвост-f для контроля файла журнала, который активно пишется в. Когда определенная строка записана в файл журнала, я хочу выйти из контроля и продолжить остальную часть моего сценария.
В настоящее время я использую:
tail -f logfile.log | grep -m 1 "Server Started"
Когда строка найдена, grep выходы как ожидалось, но я должен найти способ сделать выход команды хвоста также так, чтобы сценарий мог продолжиться.
Это будет немного хитро, так как необходимо будет войти в управление процессом и передачу сигналов. Больше 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/;
}
Так вместо того, чтобы печатать в цикле с условием продолжения, Вы могли отфильтровать для строки, соответствуют и убегают из цикла с условием продолжения, чтобы позволить Вашему сценарию продолжиться.
Любой из них должен включить просто немного обучения реализовать управление потоком наблюдения, которое Вы ищете.
Таким образом, после выполнения некоторого тестирования, я нашел быстрый способ с 1 строкой сделать эту работу. Кажется, что хвост-f выйдет, когда grep выйдет, но существует выгода. Это, кажется, только инициировано, если файл открыт и закрыт. Я выполнил это путем добавления пустой строки в файл, когда grep находит соответствие.
tail -f logfile |grep -m 1 "Server Started" | xargs echo "" >> logfile \;
Я не уверен, почему открытый/близкий из файла инициировал хвост, чтобы понять, что канал закрывается, таким образом, я не полагался бы на это поведение. но это, кажется, работает на данный момент.
Обоснуйте, что это закрывается, посмотрите на флаг-F, по сравнению с флагом-f.
Alex.
tail -f logfile |grep -m 1 "Server Started" | xargs echo "" >> /dev/null ;
эта команда никогда не выдаст запись в лог-файле, но будет тихо смазываться...
.