як подати звуковий сигнал на хвіст


14

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

У мене є така команда

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

чи є такий простий спосіб, як передача його на щось, що звучить? подобається

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

якщо так, то ще буде відображатися вихідний показник grep?


є програма звукового сигналу, яка знаходиться в репо за замовчуванням для debian, а варіанти просто apt-get install звуковий сигнал, але це не працює з трубопроводами таким чином
Jakob Cosoroaba

Відповіді:


16

Просто визначте beepтак:

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

Потім ви можете використовувати свою команду:

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

1
вибачте, але це не працює, нічого не
звучить

4
Хоча прямий вихід хвоста -f негайний, він буферизується, як тільки проходить через трубу. Доводиться чекати достатньо «чогось рідкісного», перш ніж щось спостерігати.
mouviciel

Ви можете передати висновок через sedабо подібне (між хвостом і грепом), щоб з допомогою регулярного вимикання замінити something rareсебе на багато разів. Скільки разів це потрібно зробити, залежить від того, скільки буферується труба.
Девід Спіллетт

6
@David - Це підхід хіт-упущення. Якщо ви хочете unbuffer даних , що передаються через трубу, можна використовувати будь-якого з методів , описаних в цих відповідях: stackoverflow.com/questions/1000674/turn-off-buffering-in-pipe

2
Виходячи з пропозиції @ nagul, ось виклик, який працював на мене:tail -f development.log | stdbuf -oL -eL grep "something rare" | beep
GuitarPicker

10

Екран 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
Це не звучало б лише на "щось рідкісне", чи не так?

1
Було б, якби все, що відбувалося в цьому конкретному вікні, було tail -f yourfile.log | grep something\ rareне простоtail -f logfile
Девід Спіллетт,

На жаль, я не помітив, що він бажає лише звукового сигналу something rare. Відредаговано для відображення цього. Греп спрацював би, але тоді він не побачив б решти журналу, лише рідкісні рядки - наскільки я розумію, він хоче мати змогу спостерігати за тим, як весь журнал прокручується повз, але отримує попередження про конкретні події.
Сем Стоукс

1

Ви можете зупинити завантаження виводу в команді grep. Детальніше див.

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

Наступний приклад - з звукового сигналу людини ...

   As part of a log-watching pipeline

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

У цих посібниках є багато хорошого матеріалу. Якби тільки нам не довелося їх читати, щоб знайти. ;-)


1

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

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

1
Зауважте, watchпрацює, виконуючи параметр / команду кожного (інтервального) розділу, після чого приходить результати до попереднього запуску. Таким чином, ви хочете використовувати звичайну версію хвостової команди, а не використовуватиtail -f
RyanWilcox

Це не спрацювало для мене (незважаючи на додавання watch --beepта загортання хвоста / грепа, я все ще не отримав звукового сигналу).
machineghost

1

Ви можете використовувати sed, щоб додати контрольний G так:

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

або просто на рідкісних лініях, не використовуючи греп, як слід:

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

в якому говориться: на лініях , де відбувається що - то рідкісне, S ubstitute все для того ж матеріалу з контролем-G прикріпив на кінці, і друку (але не друкувати незбіжних рядків). Чудово працює!


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

У попередній роботі я не міг отримати надійного спостерігача з просто командою-фу, тому у мене був скрипт для обгортки, як описаний нижче, який перевіряв файл кожні секунди опитування та збирав нові рядки для зацікавленої фрази.

#!/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-tools на Ubuntu) присутній, замініть

sleep $poll_duration 

з

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

Цей виклик блокується, поки файл не буде змінено. Блокуюча версія майже така ж ефективна, як і те, що ви отримаєте з tail -fверсією, якби труба могла бути налаштована на роботу без буферизації.

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.