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
自分のWebページにTwitterの呟きを表示

WordPressのTwitter表示プラグインが重たいので、直接以下のコードを …

no image
rubyの文字コードについて考える

rubyでは、1.6以降漢字コードを特別に解釈しなくなったようです。 maznは …

no image
起動時にswaponを実行して、スワップを有効にする @ Android Galaxy S with root

Galaxy S は、Google Map 使うとフリーズしてしまうが、スワップ …

no image
シェルで2進数、8進数、10進数、16進数変換@bash

シェルスクリプトで2進数や16進数を扱う方法です。 まずは、bc コマンドを使っ …

no image
rdesktopの改造@Debian etch

LinuxからWindowsのリモートデスクトップに接続するコマンドです。 De …

no image
KVM on KVM @ Fedora 17

最近のLinuxカーネルは、KVMのネスト (KVMのゲストOS上でKVMを動か …

no image
vimでシンタックスのハイライトがおかしくなる

vim では、テキストファイルの種類に応じて色をつけてくれる機能(ハイライト機能 …

no image
firefox アドオン セカンドサーチが動作しない@Firefox 3

いつ頃からかFirefoxのアドオン、セカンドサーチが機能しなくなってしまいまし …

no image
レスキューモードでLVMを認識させる@RHEL5

以下のコマンドでレスキューモードでLVMのボリュームグループを認識できます。 # …

no image
スピーカーのアイコンに×がつく@Windows 7

Windows 7を起動すると、音声は問題なく出ているのに、タスクトレイにあるス …