13

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

У меня есть следующая команда

tail -f development.log | grep "something rare"

Есть ли простой способ, как труба на что-то, что пищит? лайк

tail -f development.log | grep "something rare" | beep

Если да, будет ли отображаться вывод grep?

7 ответов7

14

Просто определите beep следующим образом:

beep() { read a || exit; printf "$a\007\n"; beep; }

Затем вы можете использовать вашу команду:

tail -f development.log | grep "something rare" | beep
9

Экран GNU имеет встроенную функцию звукового сигнала при изменении данного окна: см. Соответствующий раздел справочной страницы.

Заголовок резюме:

$ screen
$ tail -f yourfile.log    # inside the screen session
<C-a> M    # "Window 0 (bash) is now being monitored for all activity."

Как указано в комментариях, это будет звучать при каждой новой записи в журнале, а не только над теми, которые соответствуют «чему-то редкому», так что это не совсем то, о чем просил ОП. Еще полезный трюк знать ИМХО.

Вы можете получить лучшее из обоих миров, открыв два окна screen (<C-a> c чтобы открыть окно, <C-a> <C-a> чтобы переключаться между двумя окнами):

  1. отслеживается с помощью tail -f yourfile.log | grep 'something rare'
  2. без контроля, с простым tail -f yourfile.log

Затем вы можете наблюдать за прокруткой журнала в окне 2, и вы услышите сигнал из окна 1, когда произойдет «что-то редкое».

screen удивительно универсален - я настоятельно рекомендую прочитать на нем.

1

Вы можете остановить буферизацию вывода в команде grep. Смотрите man grep для деталей.

Вы можете направить вывод grep в звуковой сигнал.

Следующий пример от man beep ...

   As part of a log-watching pipeline

          tail -f /var/log/xferlog | grep --line-buffered passwd | \
          beep -f 1000 -r 5 -s

В этих руководствах много хорошего. Если бы нам не нужно было читать их, чтобы найти это. ;-)

1

Вы можете использовать sed для добавления control-G следующим образом:

tail -f myFile | sed "s/.*/&\x07/"

или просто в редких строках, без использования grep, следующим образом:

tail -f myFile | sed -n "/something rare/s/.*/&\x07/p"

в котором говорится: на линиях , где происходит что - то редкое, s ubstitute все для того же материала с контролем-G прикрепил на конце, и печати (но не печатать несовпадающих строк). Работает отлично!

1

Команда watch имеет опцию --beep, и вы также можете установить интервал опроса, но стандарт с 2 секундами должен быть в порядке

watch --beep 'tail development.log | grep "something rare"'
0

Хм, сложно. Мы могли бы сделать что-то подобное?

for i in `find | grep 7171`; do beep; echo $i; done

Или в вашем случае

for i in `tail -f development.log | grep "something rare"`; do beep; echo $i; done

Похоже, что делает некоторую буферизацию, хотя. Я посмотрю, есть ли способ отключить эту буферизацию циклом for .

Очевидно, вы должны иметь возможность регулировать буферизацию канала с помощью ulimit -p но это продолжает жаловаться на неверный аргумент для меня. Я также нашел пост, в котором утверждается, что вам нужно перекомпилировать ядро, чтобы изменить это ограничение.

0

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

#!/bin/bash

file=$1
phrase=$2
poll_duration=$3

typeset -i checked_linecount
typeset -i new_linecount
typeset -i new_lines
let checked_linecount=new_linecount=new_lines=0
echo "Watching file $file for phrase \"$phrase\" every $poll_duration seconds"

while [ 1 ]
do
        let new_linecount=`wc -l $file| awk '{print $1}'`
        if [[ $new_linecount > $checked_linecount ]]; then
                let "new_lines = $new_linecount-$checked_linecount"
                head --lines=$new_linecount "$file" | tail --lines=$new_lines | grep "$phrase" && beep
                let checked_linecount=$new_linecount
        fi
        sleep $poll_duration
done

Это было на Unix-машине. В Linux вы можете сделать это лучше, используя интерфейс inotify filewatcher. Если этот пакет (inotify-tools в Ubuntu) присутствует, замените

sleep $poll_duration 

с

inotifywait -e modify "$file"  1>/dev/null 2>&1

Этот вызов блокируется, пока файл не будет изменен. Версия с блокировкой почти так же эффективна, как и версия с tail -f если pipe можно настроить для работы без буферизации.

Примечание . Сценарий сначала выполняет head --lines=$new_linecount чтобы гарантировать, что строки, добавленные в файл после того, как мы проверили его, не искажают фрагмент файла, который проверяется в этом цикле.

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