테일 이벤트마다 PC에서 시스템 경고음을 내고 싶습니다.
다음 명령이 있습니다
tail -f development.log | grep "something rare"
삐 소리를내는 것과 같은 쉬운 방법이 있습니까? 처럼
tail -f development.log | grep "something rare" | beep
그렇다면 grep 출력이 계속 표시됩니까?
테일 이벤트마다 PC에서 시스템 경고음을 내고 싶습니다.
다음 명령이 있습니다
tail -f development.log | grep "something rare"
삐 소리를내는 것과 같은 쉬운 방법이 있습니까? 처럼
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
sed
정규 표현식을 사용하여 something rare
여러 번 출력을 통과 하거나 비슷한 (꼬리와 grep 사이) 전달할 수 있습니다. 수행해야하는 횟수는 파이프가 얼마나 버퍼링되는지에 따라 다릅니다.
tail -f development.log | stdbuf -oL -eL 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가 요청한 내용을 수행하지 않습니다. IMHO를 아는 것이 여전히 유용한 트릭입니다.
두 열어 두 세계의 최고를 얻을 수 있습니다 screen
(창 <C-a> c
, 창을 열려면 <C-a> <C-a>
두 창 사이를 전환 할 수) :
tail -f yourfile.log | grep 'something rare'
tail -f yourfile.log
그런 다음 창 2에서 과거 로그 스크롤을 보면서 앉아있을 수 있으며 "희소 한 것"이 발생하면 창 1에서 경고음이 울립니다.
screen
놀랍도록 다재다능합니다. 읽어 보는 것이 좋습니다.
tail -f yourfile.log | grep something\ rare
것이 단순한 것이 아니라tail -f logfile
something rare
. 에서 경고음을 원한다는 것을 알지 못했습니다 . 이것을 반영하도록 수정되었습니다. grep은 작동하지만 로그의 나머지 부분은 보지 못하고 희귀 한 줄만 보았습니다. 내가 이해할 때 그는 전체 로그 스크롤 과거를보고 싶지만 특정 이벤트에 대해 경고하고 싶습니다.
watch 명령에는 --beep 옵션이 있으며 폴링 간격도 설정할 수 있지만 2 초의 표준은 괜찮습니다.
watch --beep 'tail development.log | grep "something rare"'
watch
당신의 매개 변수를 실행하여 작품 / 다음 이전 실행에 결과를 오는 모든 (간격) 섹션을 명령. 따라서 당신은 사용하는 대신, 꼬리 명령의 일반 버전을 사용하는 것이 좋습니다tail -f
watch --beep
꼬리 / 그렙을 추가 하고 감싸도 불구하고 여전히 경고음이 들리지 않았습니다).
흠, 까다로운. 아마도 이런 식으로 할 수 있습니까?
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
하지만 그것은 나에게 잘못된 인수에 대해 계속 불평합니다. 또한이 한계를 변경하기 위해 커널을 다시 컴파일해야한다고 주장하는 게시물을 찾았습니다.
이전 작업에서는 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 를 수행합니다.