ログファイルを監視して、ある文字列が出力されたらイベントを発生させたかったので、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