Muninのプラグイン内でバックグラウンド実行したいときの注意点

Muninプラグインをshellスクリプト等で自作する中で、スクリプト内でバックグラウンド実行したいときは書き方に注意が必要だ。
例えば、スクリプト内で集計をして集計結果を出力したいとする。集計に時間がかかるので集計結果をファイルに吐いておき、出力は出力済みのファイルを読むだけにする。集計処理はバックグラウンド実行になる。

スクリプトを以下のように作成する。

/usr/share/munin/plugins/originalplugin_

pluginsディレクトリにsymlinkを貼る。

Munin Nodeサーバ上でmunin-run original_targetname1を実行すると、集計部分はバックグラウンド実行され、すぐに結果が出力される。
しかしMuninのMasterサーバから実行されたときは、集計が終わるまで結果が返ってこない。もし集計がMuninのtimeout値を超えるようであれば、エラーとなり、/var/log/munin-node/munin-node.logにService 'orignal_targetname1' timed out.と出力されてしまう。

MuninのMasterから実行されるときは、Munin NodeへTCP通信をして、fetch plugin名と命令を出す。
上記のスクリプトではバックグラウンド実行されていてもコマンド終了時まで標準出力を保持してしまい、TCP通信が閉じられない。
理屈としてはSSHでコマンド実行した時にコマンド終了後も制御が戻らない時の対処方法と似ている。

対策はSSHでコマンド実行した時にコマンド終了後も制御が戻らない時の対処方法で実施したのと同じように、標準出力を/dev/nullに捨ててあげること。ついでにエラー出力も不要であれば捨ててもいい。

Munin Masterからtelnetで実行してもすぐに応答がかえるようになった。

ちなみに、集計コマンドのcalculate_commandが標準出力を以下のように結果ファイルにリダイレクトするような作りであれば、問題は発生しない。

しかし、calculate_command内でファイルに書き込んでいたり、以下のようにsed等で編集していたりしていると、標準出力を/dev/nullに捨ててあげるしかない。

-Linux
-