Mazn.net

やってみて 調べてみて 苦労しなけりゃ 箱は動かじ

ログファイル監視 + イベントスクリプト@ruby

      2013/07/15

ログファイルを監視して、ある文字列が出力されたらイベントを発生させたかったので、rubyで監視スクリプトを書いたので紹介します。

“log”というファイルを”hoge”という文字列で監視したい場合の使い方。

$ ./monitor.rb log hoge
ファイルlog を文字列hoge で監視します

ここで、他のコンソールから

$ echo "1234hoge5678" >> log

とすると下記のように出力されて終了します。

*** MATCH : 1234hoge5678

ログによってはcronでローテーションされて切り詰められて、新しい空のファイルになることもあるので、 その場合は古いファイルを見ずに新しいファイルを見るような処理も入っています。

ファイル名 : monitor.rb
-------------------------
#!/usr/bin/ruby

def usage()
    puts "\nusage : ./monitor.rb filename string"
    puts "          filenameで指定されたファイルをstringで監視し、マッチすれば終了します"

end

if (ARGV[0].nil? || ARGV[1].nil?)
    puts "引数が足りません"
    usage()
    exit!
else
    begin
        filename = ARGV[0]
        file = File.open(filename, "r")
        filesize = File.size?(filename)
        if (filesize == nil)
            filesize = 0
        end
    rescue => e
        puts e
        puts filename + "を開くことができません"
        usage
        exit!
    end
    str = ARGV[1]
    puts "ファイル" + filename + " を文字列" + str + " で監視します"
end

#最終行まで移動
file.seek(0,IO::SEEK_END)

begin
    # 読み込みループ
    while (true) do
        line = file.gets()
        if (! line.nil?)
            if ( /#{str}/ =~ $_ )
                puts "*** MATCH : " + $_
                exit
            end
        else
            sleep(0.5)

            if ( ! File.exist?(filename))
                puts "ファイルが削除されました"
                file.close()
                exit!
            end

            newFilesize = File.size?(filename)
            if (newFilesize == nil)
                newFilesize = 0
            end
            if ($DEBUG)
                puts "oldsize : "+ filesize.to_s + " newsize : " + newFilesize.to_s
            end
            if (newFilesize < filesize)
                puts "ファイルが切り詰められました. 新しいファイルを読み込みます"
                file.close()
                begin
                    file = File.open(filename)
                rescue => e
                    puts e
                    puts "ファイルを再オープンできません"
                    exit!
                end
                file.seek(0,IO::SEEK_END)
            end
            filesize = newFilesize
        end
    end
ensure
    if (! file.closed?)
        file.close()
    end
    exit!
end

 - IT技術, プログラミング

336px

Message

メールアドレスが公開されることはありません。

  関連記事

no image
セキュアなWPA-PSK + インフラストラクチャモードでテザリング@Galaxy S with root

Wifiでテザリングするために、Android で root とって、Wirel …

no image
Galaxy SIIIのカメラのシャッター音を消す@Android 4.1.2

root 化した端末必須です。 root 権限で実行でき、/system を読み …

no image
Acer AS1410 の無線LAN 11n設定

Acer AS1410購入しました。ついにで無線LANが11nに対応しているので …

no image
linuxのSWAPパーティッションにUUIDを指定する

ext3とかext4のパーティッションはtune2fsでUUIDを指定できますが …

no image
フルスクリーン時に日本語入力ツールバーが邪魔@Ubuntu 9.04

scim+anthy で日本語入力していましたが、動画を見るときにフルスクリーン …

no image
VMWare Server 2.0のディスクイメージを1.0で使う

VMWare Server 2.0がリリースされて随分たちましたが、2.0系のデ …

ISOイメージをUSBメモリに入れてLinuxインストール

以前、grubを手動で入れて、USBメモリからOSをインストールするようなことを …

no image
OpenSSL, OpenSSH脆弱性@Debian

Debian etch以降のOpenSSL, OpenSSHで大きな脆弱性が発見 …

no image
gmailでフィルタリング転送した時メールは受信トレイに残るの?

gmailの基本転送機能は全てのメールをあるアドレスに転送しますが、フィルタを用 …

no image
LVM覚え書き@Fedora14

LVMの使い方をすぐ忘れてしまうので、覚え書き。 LVM用のパーティションを用意 …