tail -f 이벤트에서 경고음을 울리는 방법


14

테일 이벤트마다 PC에서 시스템 경고음을 내고 싶습니다.

다음 명령이 있습니다

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

삐 소리를내는 것과 같은 쉬운 방법이 있습니까? 처럼

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

그렇다면 grep 출력이 계속 표시됩니까?


데비안의 기본 REPO에 그냥 경고음을 설치 apt-get을 변형하지만 배관 이런 식으로 일을하지 않는으로 경고음 프로그램이있다
야콥 Cosoroaba

답변:


16

beep다음과 같이 정의하십시오 .

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

그런 다음 명령을 사용할 수 있습니다.

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

1
죄송하지만이 작동하지 않습니다, 그것은 경고음이나 인쇄 아무것도하지 않습니다
야콥 Cosoroaba에게

4
tail -f의 직접 출력은 즉각적이지만 파이프를 통과하자마자 버퍼링됩니다. 무언가를 관찰하기 전에 충분한 "희소 한 것"을 기다려야합니다.
mouviciel

sed정규 표현식을 사용하여 something rare여러 번 출력을 통과 하거나 비슷한 (꼬리와 grep 사이) 전달할 수 있습니다. 수행해야하는 횟수는 파이프가 얼마나 버퍼링되는지에 따라 다릅니다.
David Spillett

6
@David-그것은 히트 앤 미스 접근법입니다. : 당신이 파이프를 통해 전달 된 데이터를 버퍼 해제하려면이 답변에 설명 된 방법 중 하나를 사용 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."

의견에서 지적했듯이 이것은 "매우 드문 일"과 일치하는 항목뿐만 아니라 모든 새 로그 항목에서 경고음을 내 므로 OP가 요청한 내용을 수행하지 않습니다. IMHO를 아는 것이 여전히 유용한 트릭입니다.

두 열어 두 세계의 최고를 얻을 수 있습니다 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
David Spillett

죄송합니다 something rare. 에서 경고음을 원한다는 것을 알지 못했습니다 . 이것을 반영하도록 수정되었습니다. grep은 작동하지만 로그의 나머지 부분은 보지 못하고 희귀 한 줄만 보았습니다. 내가 이해할 때 그는 전체 로그 스크롤 과거를보고 싶지만 특정 이벤트에 대해 경고하고 싶습니다.
Sam Stokes

1

grep 명령에서 출력 버퍼링을 중지 할 수 있습니다. 자세한 내용은 man 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를 사용하여 다음과 같이 control-G를 추가 할 수 있습니다.

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

또는 다음과 같이 grep을 사용하지 않고 희귀 한 라인에 있습니다.

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

이전 작업에서는 command-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

이것은 유닉스 머신에있었습니다. Linux에서는 inotify filewatcher 인터페이스를 사용하여 더 나아질 수 있습니다 . 이 패키지 ( 우분투의 inotify-tools )가 있으면 교체하십시오.

sleep $poll_duration 

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

이 호출은 파일이 수정 될 때까지 차단됩니다. 파이프를 버퍼링하지 않고 작동하도록 구성 할 수있는 경우 차단 버전은 버전에 비해 거의 효율적 tail -f입니다.

참고 : 스크립트는 먼저 head --lines=$new_linecount파일을 검사 한 후 파일에 추가 된 행이이 루프에서 검사되는 파일 청크를 왜곡하지 않도록하기 위해 a 를 수행합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.