как подать звуковой сигнал на хвосте-f событие

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

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

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

существует ли простой способ как pipeing это к чему-то, что подает звуковой сигнал? как

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

раз так grep произведет все еще быть показанным?

14
задан 21.07.2014, 09:38

5 ответов

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

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

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

tail -f development.log | grep "something rare" | beep
16
ответ дан 07.12.2019, 11:15

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

Сводка заголовка:

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

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

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

  1. контролируемый, с tail -f yourfile.log | grep 'something rare'
  2. неконтролируемый, с плоскостью tail -f yourfile.log

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

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

10
ответ дан 07.12.2019, 11:15

Гм, хитрый. Мы могли, возможно, сделать что-то вроде этого?

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
ответ дан 07.12.2019, 11:15

В предыдущем задании я не мог получить надежного наблюдателя только с командой-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-инструменты на Ubuntu) присутствует, замена

sleep $poll_duration 

с

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

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

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

0
ответ дан 07.12.2019, 11:15

Можно мешать выводу быть буферизованными в команде grep. Посмотрите человека grep для деталей.

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

Следующий пример от звукового сигнала человека...

   As part of a log-watching pipeline

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

Существует много хорошего материала в тех руководствах. Если только мы не должны были читать их для нахождения его.;-)

1
ответ дан 07.12.2019, 11:15

Теги

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