kuyruk -f olay bip sesi nasıl


14

Bilgisayarımın her kuyruk olayında bir sistem sesi vermesini istiyorum

Aşağıdaki komutu aldım

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

bip sesi olan bir şeye boru döşemek gibi kolay bir yol var mı? sevmek

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

eğer öyleyse grep çıktısı hala gösterilecek mi?


debian ve varyantları için varsayılan
repoda

Yanıtlar:


16

Sadece beepaşağıdaki gibi tanımlayın :

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

Ardından, komutunuzu kullanabilirsiniz:

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

1
üzgünüm ama bu çalışmıyor, bip sesi
çıkarmıyor

4
Her ne kadar kuyruk -f'nin doğrudan çıktısı hemen olsa da, bir borudan geçer geçmez tamponlanır. Herhangi bir şeyi gözlemlemeden önce yeterli "nadir bir şey" beklemek zorundasınız.
mouviciel

Çıktıyı sedbir regexp ile veya benzeri (kuyruk ve grep arasında) something rarebirçok kez onunla değiştirebilirsiniz . Kaç kez yapılması gerektiği, borunun ne kadar tamponlandığına bağlıdır.
David Spillett

6
@David - Bu bir vur ve kaç yaklaşım. Bir kanaldan geçirilen verilerin arabelleğini kaldırmak istiyorsanız, şu cevaplarda açıklanan yöntemlerden birini kullanın: stackoverflow.com/questions/1000674/turn-off-buffering-in-pipe

2
@ Nagul'un önerisinden hareketle, işte benim için çalışan çağrı:tail -f development.log | stdbuf -oL -eL grep "something rare" | beep
GuitarPicker

10

GNU ekranı , belirli bir pencere değiştiğinde bip sesi çıkaracak yerleşik bir özelliğe sahiptir: kılavuz sayfasının ilgili bölümüne bakın .

Başlık özeti:

$ screen
$ tail -f yourfile.log    # inside the screen session
<C-a> M    # "Window 0 (bash) is now being monitored for all activity."

Yorumlarda belirtildiği gibi, bu sadece "nadir" bir şeyle eşleşenler değil , her yeni günlük girişinde bip sesi çıkarır, bu OP'nin istediği şeyi yapmaz. IMHO'yu tanımak için hala yararlı bir numara.

İki screenpencere açarak her iki dünyanın da en iyisini elde edebilirsiniz ( <C-a> cbir pencere açmak, <C-a> <C-a>iki pencere arasında geçiş yapmak için):

  1. ile izlendi tail -f yourfile.log | grep 'something rare'
  2. izlenmemiş, düz tail -f yourfile.log

Sonra pencere 2'de günlük kaydırma izleyerek oturup, "nadir bir şey" meydana geldiğinde 1. pencereden bip sesi alacaksınız.

screen awesomely çok yönlü - üzerinde okuma tavsiye ederim.


1
Bu sadece "nadir bir şey" için bip sesi çıkarmaz, değil mi?

1
O pencerede tail -f yourfile.log | grep something\ raretail -f logfile
olanların

Hata! Sadece bip sesi istediğini fark etmedim something rare. Bunu yansıtacak şekilde düzenlendi. Grep işe yarayacaktı, ancak o zaman günlüğün geri kalanını, sadece nadir çizgileri görmeyecekti - anladığım kadarıyla, tüm günlüğü kaydırarak izlemek istiyor, ancak belirli olaylarda uyarılmak istiyor.
Sam Stokes

1

Çıktının grep komutunda arabelleğe alınmasını durdurabilirsiniz. Ayrıntılar için man grep'e bakınız.

Grep çıkışını bip sesi çıkarabilirsiniz.

Aşağıdaki örnek insan bip sesinden ...

   As part of a log-watching pipeline

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

Bu el kitaplarında çok iyi şeyler var. Keşke onları bulmak için onları okumak zorunda olmasaydık. ;-)


1

Watch komutunun --beep seçeneği vardır ve yoklama aralığını da ayarlayabilirsiniz, ancak 2 saniyelik standart iyi olmalıdır

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

1
Not, watchparametrenizi / komutunuzu her (aralık) bölümde çalıştırarak ve sonuçları bir önceki çalışmaya getirerek çalışır. Böylece kuyruk komutunun normal versiyonunu kullanmak yerine kullanmak tail -f
istersiniz

Bu benim için işe yaramadı ( watch --beepbenim kuyruk / grep ekleme ve sarma rağmen , hala bir bip alamadım).
machineghost

1

Sed-G'yi aşağıdaki gibi eklemek için sed kullanabilirsiniz:

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

veya grep kullanmadan sadece nadir hatlarda aşağıdaki gibi:

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

hangi diyor ki: Nadir bir şey meydana hatlarında, s yerini tutmaz ucunda tutturdu kontrol G ile aynı şeyler için her şey ve baskı (ama eşleşmeyen satırları yazdırmayın). Harika çalışıyor!


0

Hım, zor. Belki böyle bir şey yapabiliriz?

for i in `find | grep 7171`; do beep; echo $i; done

Veya senin durumunda

for i in `tail -f development.log | grep "something rare"`; do beep; echo $i; done

Yine de bazı tamponlama yapıyor gibi görünüyor. forDöngü tarafından bu arabelleği kapatmanın bir yolu olup olmadığına bakacağım .

Görünüşe göre, borunun tamponlamasını kullanarak ayarlayabilmelisiniz, ulimit -pancak bu bana Geçersiz argüman hakkında şikayet etmeye devam ediyor. Bu sınırı değiştirmek için çekirdeği yeniden derlemeniz gerektiğini iddia eden bir yazı da buldum.


0

Önceki bir işte, sadece komut-fu ile güvenilir bir izleyici alamadım, bu yüzden her anket_duration saniyede dosyayı inceleyen ve ilgili ifade için yeni satırları selamlayan aşağıdaki gibi bir sarıcı komut dosyası vardı .

#!/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

Bu bir Unix makinesindeydi. Linux'ta, onun kullanarak daha iyi bir tane gidebilir Inotify filewatcher arayüzü. Bu paket ( Ubuntu'da inotify araçları ) varsa, değiştirin

sleep $poll_duration 

ile

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

Bu çağrı, dosya değiştirilene kadar engeller. Engelleme sürümü, tail -farabellek arabelleğe alınmadan çalışacak şekilde yapılandırılabiliyorsa , sürümle alacağınız kadar etkilidir .

Not: Komut dosyası head --lines=$new_linecount, dosyayı kontrol ettikten sonra dosyaya eklenen satırların, bu döngüde kontrol edilen dosyanın yığınını çarpmadığından emin olmak için bir a yapar .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.