web-dev-qa-db-ja.com

テール-fイベントでビープ音を鳴らす方法

PCでテールイベントごとにシステムビープ音を鳴らしたい

私は次のコマンドを持っています

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

ビープ音を鳴らすものにパイプで接続するような簡単な方法はありますか?お気に入り

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

その場合、grep出力は引き続き表示されますか?

14
Jakob Cosoroaba

beepを次のように定義するだけです。

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

次に、コマンドを使用できます。

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

GNU screen は、特定のウィンドウが変更されたときにビープ音を鳴らす機能が組み込まれています。 manページの関連セクション を参照してください。

見出しの要約:

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

コメントで指摘されているように、これは「珍しいもの」に一致するものだけでなく、すべての新しいログエントリでビープ音を鳴らします。 OPが求めたもの。それでも私見を知るための便利なトリック。

2つのscreenウィンドウを開くと、両方の長所を活かすことができます(<C-a> cウィンドウを開くには、<C-a> <C-a> 2つのウィンドウを切り替える):

  1. 監視、tail -f yourfile.log | grep 'something rare'
  2. 監視されていない、プレーンなtail -f yourfile.log

次に、ウィンドウ2でログがスクロールするのを見て座って、「何か珍しい」ことが発生するとウィンドウ1からビープ音が鳴ります。

screenは非常に用途が広いです-私はそれを読むことを強くお勧めします。

10
Sam Stokes

Grepコマンドで出力のバッファリングを停止できます。詳細については、mangrepを参照してください。

Grep出力をビープ音にパイプすることができます。

次の例は、ビープ音からのものです...

   As part of a log-watching pipeline

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

それらのマニュアルにはたくさんの良いものがあります。それを見つけるためにそれらを読む必要がなければ。 ;-)

1
A reader

次のように、sedを使用してcontrol-Gを追加できます。

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

または、次のように、grepを使用せずに、まれな行でのみ実行します。

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

つまり、まれなことが発生する行では、s同じものの代わりにcontrol-Gを最後に付けて印刷します(ただし、一致しない行は印刷しないでください)。よく働く!

1
Mi5ke

Watchコマンドには--beepオプションがあり、ポーリング間隔も設定できますが、2秒の標準で問題ありません。

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

うーん、トリッキー。私たちはおそらくこのようなことをすることができますか?

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
Ivan Vučica

以前の仕事では、command-fuだけでは信頼できるウォッチャーを取得できなかったため、次のようなラッパースクリプトを使用して、poll_duration秒ごとにファイルを検査しました。関心のあるフレーズの新しい行をgrepしました。

#!/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インターフェースを使用することで1つ上手くいくことができます。このパッケージ(Ubuntuではinotify-tools)が存在する場合は、

sleep $poll_duration 

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

この呼び出しは、ファイルが変更されるまでブロックされます。 ブロッキングバージョンは、パイプがバッファリングなしで機能するように構成できる場合、tail -fバージョンで得られるものとほぼ同じくらい効率的です。

注:スクリプトは最初にhead --lines=$new_linecountを実行して、チェック後にファイルに追加された行が、このループでチェックされるファイルのチャンクを歪めないようにします。

0
user4358