Подобный этому вопросу, в Linux tcsh я хочу выследить файл журнала и когда я соответствую регулярному выражению, я хочу выполнить произвольную команду. Как я могу сделать это?
В примечании плаката комментарий в том вопросе приводит к ТАК сообщение при отключении автобуферизации при использовании каналов. Решение состояло в том, чтобы использовать, освобождают буфер (от, ожидают), как в:
$ unbuffer tail -f foo | find-and-run "findwhat" "runwhat"
ответ wfaulk (плюс очистка ayrnieu) предоставляет нам сценарий find-run:
#!/usr/bin/perl
# run: find-and-run "regex-to-find" "commandtorun"
die "usage: $0 <regex> <exec-this> [exec-this-arg1 ...]\n"
unless @ARGV >= 2;
my ($re, @run) = @ARGV;
while (<>) {
last if /$re/;
}
exec { $run[0] } @run;
Примечание 1: на Debian lenny необходимо будет установить "ожидать-dev" пакет; освободите буфер установлен как "expect_unbuffer".
Примечание 2: это полностью не тестируется и полностью немного наивно. для безопасности не используйте это. при использовании этого Вы, вероятно, хотите к одинарной кавычке, чтобы Ваш regex избежал замены/расширения оболочки.
Примечание 3: большое спасибо ayrnieu для завершения сценария и очистки.
Это кажется подходящий для короткого сценария жемчуга:
#!/usr/bin/perl
while (<>) {
last if /regex/;
}
system("ls");
Если Вы хотите обеспечить шаблон и команду с как отмеченные аргументы, см. документацию в perldoc Getopt::Std
.
В моем случае (на RHEL, я хотел tail -n 0 -f file | grep -m 1 pattern
для завершения сразу, когда шаблон происходит в растущем файле) простое использование освобождать буфер утилиты от Ожидать пакета не решило проблему по некоторым причинам.
Но на основе сообщения в блоге (http://www.smop.co.uk/blog/index.php/2006/06/26/tail-f-and-awk/) я обнаружил, что перенаправление входа от хвоста, запущенного в подоболочке, добилось цели:
grep -m 1 pattern <(tail -n 0 -f file)
Это не было столь же просто, все же. При работе в интерактивной оболочке та же команда, когда выполнено удаленно с помощью SSH, все еще заморозилась, как обычно:
ssh login@hostname 'grep -m 1 pattern <(tail -n 0 -f file)'
Я обнаружил, что в этом случае, нужно освободить буфер, вывод хвоста с помощью освобождать буфер утилиты от Ожидает:
ssh login@hostname 'grep -m 1 pattern <(unbuffer -p tail -n 0 -f file)'
Это не должно использоваться на интерактивной оболочке - освобождают буфер, вызовет ioctl(raw): I/O error
!
Таким образом, совет для Вас состоит в том, что, если предлагаемые решения не работают, попытайтесь запуститься tail -f
в подоболочке и если Вы хотите сделать это в сценарии или на неинтерактивной оболочке, с помощью unbuffer
или unbuffer -p
мог бы требоваться.
BTW, см. эту статью для полного объяснения выходной проблемы буферизации: http://www.pixelbeat.org/programming/stdio_buffering/