swatchでログ監視

perlで作成されている。指定したログをリアルタイムで監視して、

  • 特定のメッセージを検出
  • 外部コマンドの実行

などが出来る。swatch単独で起動するので、cronと無関係。

swatchrc

書式

watchforで検出する文字列を正規表現で書く。ignoreで無視する文字列を指定することも可能。(ignoreを設定する場合はwatchforより上に書く)

watchfor /regex/
  action1
  action2
  ...

特殊変数

$_

マッチした文字列に置き換わる。外部コマンドの引数、メールのsubjectなどに渡すと便利。ただし、コマンドの引数に渡す場合に文字列内に空白が含まれると複数個の引数になるので扱いに注意。ダブルクォーテーションで囲ってしまえば無問題。

watchfor /error/
  exec /path/to/program "$_"

主に設定するアクション

echo

ターミナルに検出した文字列を表示

exec command

文字列を検出した際に実行するコマンド

mail [=address1:address2:...][,subject=your_text_here]

検出した際にメール送信

swatchの起動

引数が少しややこしいかも。

swatch \
  --pid-file=/var/run/swatch.pid \
  --config-file=/path/to/swatchrc \
  --tail-file=/path/to/logfile \
  --tail-args='--follow=name --retry -n 0' &

option

--pid-file

swatchを常駐したときのpidファイル。pidファイルがいらないなら不要

--config-file

swatchrcの場所

--tail-file

監視するログファイル

--tail-args

swatchはデフォルトではtailコマンドでファイルを監視する。そのtailコマンドに渡すオプション。tailで"--follow=name"としているのは、ログファイルがローテートされた際に対応するため。tailはdefaultではfile descripterを追うので、例えば/var/log/messages => /var/log/messages.1とローテートされた場合に、swatchを再起動するまで/var/log/messages.1を監視し続けることになる。

携帯電話のUser-Agent

apacheのRewriteでたまに使うのでメモ。正規表現で。

^DoCoMo    
^KDDI-     
^UP.Browser
^J-PHONE  
^Vodafone
^SoftBank
^MOT-

イーモバイルiPhoneは知らない。iPhoneSafariだからMozillaほにゃららになるのかな。

追記

実際に書く場合は|でまとめて書いたほうがスッキリするか。

^(DoCoMo|UP.Browser|KDDI|SoftBank|Vodafone|J-PHONE|MOT-)

linuxでsnmptrap送信メモ


設定すればapacheが停止したらtrap送信、とかも出来るらしい。うちは今のところmonitで監視してるからその設定は必要ないけど。。

man snmptrap

SYNOPSIS
  snmptrap -v 1 [COMMON OPTIONS] [-Ci] enterprise-oid agent generic-trap specific-trap uptime [OID TYPE VALUE]...
  snmptrap -v [2c|3] [COMMON OPTIONS] [-Ci] uptime trap-oid [OID TYPE VALUE]...
  snmpinform -v [2c|3] [COMMON OPTIONS] uptime trap-oid [OID TYPE VALUE]...

command叩いて送信

  • 実行例
## snmptrap -v [2c|3] [COMMON OPTIONS] [-Ci] uptime trap-oid [OID TYPE VALUE]...
snmptrap -v2c -c public snmp.trapd.server '' .1.3.6.1.4.1.10000 1 s "hogehoge"

snmpd.confの設定

ここでdefaultのcommunity設定とかする。

trapcommunity public
trapsink   snmp.trapd.server public
informsink snmp.trapd.server public

mysqlで既存の状態からレプリケーション構築 - innodb編

webの情報を見てると、まずデータディレクトリをtarで固めて・・・というのを良くみかける。MyISAMのみならそれでもいいと思うけど、InnoDBを使用してるとちょっと不都合かなと思って調べた。
というのもInnoDBのデータ領域は設定した分だけ最初にディスクに作成されるので、数GByteに設定している場合、実際に使ってる実データは少なくてもtarで時間がかかってしまうから。


調べながら試行錯誤したら、mysqldumpを使うだけで出来た。ただし、この方法の場合、dumpを取る間に全テーブルにREAD LOCKを掛ける。master dataの取得さえ先にしとけば、--lock-all-tablesしなくてもいけそうだけど。

masterでの作業

全データのdumpを取得する。

$ mysqldump \
 --all-databases \
 --add-drop-database \
 --add-drop-table \
 --master-data \
 --lock-all-tables \
 > dumpdata

オプションの意味。

--master-data

mysqldumpコマンド実行時の、マスターの状態(binary log filename, log position)をdumpdataに保存する。show master statusを手動で記録する手間が省けるので、ここで取得しとく。--master-dataを指定すると--lock-all-tablesは自動でオンになる。

--add-drop-database --add-drop-table

create database,tableをする前にdropする。

--lock-all-tables

(古いバージョンの場合は--first-slave)
mysqldump中、全tableにREAD LOCKする。--single-transactionと--lock-tablesは自動でオフになる。--master-dataを指定すれば--lock-all-tablesは自動でオンになるので、実は指定しなくても良い。けど解りやすいので明示的に指定してみた。

  • --add-locksとの違い

--add-locksは各tableをdumpする前後にlock tables、unlock tablesを掛ける。なので普通にdumpするだけなら--add-locksのほうが良い。ただし、--master-dataを使ってレプリケーションのためのdumpを取る場合はダメなはず。なぜなら、--master-dataの結果はdumpの初めに書き込まれるため、mysqldump中に他のtableが更新されるとlog positionがずれてしまうから。たぶん。
追記:あれ?master dataはdumpの先頭に記録されるから、その後tableが更新されても実は問題ないのではないだろうか。slaveはbinlog positionから追いかければいいわけだし。うーんよくわからない。まぁ、--master-dataを指定すれば自動で付くオプションなので、--lock-all-tablesで間違いはない、ということで良しにしよう。

slaveでの作業

my.cnfにskip-slaveを入れてmysqld起動。あとはdumpdataを流すだけ。

$ mysql < dumpdata
$ mysql -e 'start slave'

これで完了。後はmy.cnfのskip-slaveをコメントしておく。

送信ドメイン認証のヘッダ

spamがいっぱい届くようになって、ふと気になったので調べた。
http://www.plus-server.net/wa_service/kinou-spf.html

  • Received-SPF: pass

認証OK

  • Received-SPF: softfail

クオリファイヤの"~"にマッチしたホスト。認証NG。RFC的にはSoftFailの段階ではメールを拒否すべきではないとのこと。=> じゃあ何のためのfailなんだろう。SPAMのScore値を加算して、後の判断に利用するとか??

  • Received-SPF: fail

クオリファイヤの"-"にマッチしたホスト。認証NG

drbdでfstabを間違えてブートが途中で止まった

初歩的なことでうっかり。

/etc/fstab

# 最後のオプションは0
/dev/drbd0     /data           ext3    noauto 1 0

# 間違い
/dev/drbd0     /data           ext3    noauto 1 1

fstabの6番目のオプションが1だとブート時にファイルシステムのチェックが入るけど、ブート時には/dev/drbd0がない*1のでエラーになって途中で止まってしまった。

*1:/dev/drbd*はdrbdの起動スクリプトで作成する設定にしているのでブート時にはまだ存在してない