10

grep を使用してログ ファイルを末尾表示し、次のようにメールで送信します。

tail -f /var/log/foo.log | grep error | mail -s subject name@example.com

これどうやってするの?

4

3 に答える 3

23

メールエラーが発生したときにメールを送信したいですか?それは失敗するかもしれません;)

ただし、次のようなことを試すことができます。

tail -f $log |
grep --line-buffered error |
while read line
do
    echo "$line" | mail -s subject "$email"
done

grep出力のすべての行に対してどれが電子メールを送信しますか。

上記のシェルスクリプトを

nohup ./monitor.sh &

そのため、バックグラウンドで実行され続けます。

于 2011-01-11T12:49:26.880 に答える
2

これでやってみます。おそらく、私の厄介なbashコードが精査されれば、私は何かを学ぶでしょう。これを行うための膨大な数の解決策がすでに存在する可能性がありますが、あなたがサイバーオーシャンの深さと幅をトロールしたと確信しているので、私は見つけるつもりはありません。必要なものを2ビットに分けることができるようです。1)定期的にファイルの「最新のテール」を取得します。2)最新のテールが実際に存在する場合は、電子メールで送信します。1)の定期的な間隔には、cronを使用します。2)で最新のテールを取得するには、ファイルサイズを追跡する必要があります。以下のbashスクリプトはそれを行います-これは、cronによって呼び出すことができる2)の解決策です。キャッシュされたファイルサイズを使用して、メール送信する必要のあるファイルのチャンクを計算します。ファイルmyfileに対して、別のファイル.offset.myfileが作成されることに注意してください。また、スクリプトでは、ファイル名にパスコンポーネントを含めることはできません。書き直すか、呼び出しで修正します[eg(cd / foo / bar && segtail.sh zut)、segtail.shと呼ばれると仮定します]。

#!/usr/local/bin/bash
file=$1
size=0
offset=0
if [[ $file =~ / ]]; then
   echo "$0 does not accept path components in the file name" 2>&1
   exit 1
fi
if [[ -e .offset.$file ]]; then
   offset=$(<".offset.$file")
   fi
if [[ -e $file ]]; then
   size=$(stat -c "%s" "$file")    # this assumes GNU stat, possibly present as gstat. CHECK!
                                   # (gstat can also be Ganglias Status tool - careful).
fi
if (( $size < $offset )); then     # file might have been reduced in size
   echo "reset offset to zero" 2>&1
   offset=0
fi
echo $size > ".offset.$file"
if [[ -e $file &&  $size -gt $offset ]]; then
   tail -c +$(($offset+1)) "$file" | head -c $(($size - $offset)) | mail -s "tail $file" foo@bar
fi
于 2011-01-11T12:49:01.060 に答える