วิธีการส่งเสียงเตือนเมื่อเกิดเหตุการณ์ tail -f


14

ฉันต้องการให้พีซีทำระบบบี๊บในทุก ๆ เหตุการณ์ที่เกิดขึ้น

ฉันมีคำสั่งดังต่อไปนี้

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

มีวิธีง่าย ๆ เช่นไปป์กับสิ่งที่ส่งเสียงบี๊บ? ชอบ

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

ถ้าเป็นเช่นนั้นผลผลิต grep จะยังคงแสดงอยู่?


มีโปรแกรมเสียงเตือนที่มีอยู่ใน repo เริ่มต้นสำหรับเดเบียนและพันธุ์เพียง apt-get install เสียงเตือน แต่ไม่ได้ทำงานร่วมกับทางท่อนี้
จาคอบ 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หรือคล้ายกัน (ระหว่างหางและ grep) ด้วย regexp แทนที่something rareด้วยตัวเองหลายครั้ง จะต้องทำกี่ครั้งขึ้นอยู่กับว่ามีบัฟเฟอร์มากแค่ไหน
David Spillett

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."

ดังที่ระบุไว้ในความคิดเห็นสิ่งนี้จะส่งเสียงบี๊บในรายการบันทึกใหม่ทุกรายการไม่ใช่เฉพาะรายการที่ตรงกับ "บางสิ่งที่หายาก" ดังนั้นสิ่งนี้จึงไม่ได้ทำตามที่ 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 ดูรายละเอียด 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

คำสั่ง watch มีตัวเลือก --beep และคุณสามารถกำหนดช่วงเวลาการโพลได้เช่นกัน แต่มาตรฐานที่มี 2 วินาทีควรจะเป็น ok

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

1
หมายเหตุwatchทำงานโดยการเรียกใช้พารามิเตอร์ / คำสั่งของคุณทุกส่วน (ช่วงเวลา) จากนั้นมาผลลัพธ์เพื่อการเรียกใช้ก่อนหน้า ดังนั้นคุณจะต้องการที่จะใช้รุ่นปกติของคำสั่งหางแทนการใช้tail -f
RyanWilcox

สิ่งนี้ไม่ได้ผลสำหรับฉัน (แม้จะเพิ่มwatch --beepและห่อหาง / grep ของฉันฉันยังไม่ได้รับเสียงบี๊บ)
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

ในงานก่อนหน้านี้ฉันไม่สามารถได้รับการเฝ้าดูความน่าเชื่อถือที่มีเพียงคำสั่ง Fu เพื่อให้ฉันได้สคริปต์เสื้อคลุมอย่างหนึ่งที่ด้านล่างซึ่งการตรวจสอบไฟล์ทุกpoll_durationวินาทีและ grepped สายใหม่สำหรับวลีที่สนใจ

#!/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-toolsบน Ubuntu) มีอยู่ให้แทนที่

sleep $poll_duration 

กับ

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

การเรียกนี้จะบล็อกจนกว่าไฟล์จะถูกแก้ไข เวอร์ชันการบล็อกมีประสิทธิภาพเกือบเท่ากับที่คุณจะได้รับกับtail -fเวอร์ชันหากสามารถกำหนดค่าไพพ์ให้ทำงานโดยไม่ต้องบัฟเฟอร์

หมายเหตุ:สคริปต์จะทำก่อนhead --lines=$new_linecountเพื่อให้แน่ใจว่าบรรทัดที่เพิ่มลงในไฟล์หลังจากที่เราตรวจสอบแล้วจะไม่บิดเบือนไฟล์ที่ได้รับการตรวจสอบในลูปนี้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.