Я хочу, чтобы мой ПК заставил систему подать звуковой сигнал на каждом событии хвоста
У меня есть следующая команда
tail -f development.log | grep "something rare"
существует ли простой способ как pipeing это к чему-то, что подает звуковой сигнал? как
tail -f development.log | grep "something rare" | beep
раз так grep произведет все еще быть показанным?
Просто определите beep
как следующее:
beep() { read a || exit; printf "$a\007\n"; beep; }
Затем можно использовать команду:
tail -f development.log | grep "something rare" | beep
Экран 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>
переключаться между двумя окнами):
tail -f yourfile.log | grep 'something rare'
tail -f yourfile.log
Затем можно сидеть, наблюдая прокрутку журнала мимо в окне 2, и Вы будете поданы звуковой сигнал из окна 1, когда "что-то редкое" произойдет.
screen
удивительно универсально - я настоятельно рекомендую чтение на нем.
Гм, хитрый. Мы могли, возможно, сделать что-то вроде этого?
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
но это продолжает жаловаться на Недействительный аргумент мне. Я также нашел сообщение, которое утверждает, что необходимо перекомпилировать ядро для изменения этого предела.
В предыдущем задании я не мог получить надежного наблюдателя только с командой-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
гарантировать, чтобы строки, добавленные к файлу после того, как мы проверили его, не скашивали блок файла, в котором регистрируются этот цикл.
Можно мешать выводу быть буферизованными в команде 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
Существует много хорошего материала в тех руководствах. Если только мы не должны были читать их для нахождения его.;-)