Prev / Next

2012-09-27 / munin-async を Solaris 11 上で動かしたい

#osoljp の contrib-spec-files に munin 2.0.6 をコミットしたし,
依存関係もある程度解決したので,そろそろ munin-async を試そうかと.

munin-async の使い方はここを参照.
http://munin.readthedocs.org/en/latest/node/async.html

とりあえず,munin-asyncd を実行してみる.

$ sudo -u munin /usr/share/munin/munin-asyncd -v
    Cannot lock tied file '/var/lib/munin/spool/SPOOL-META' - Bad file number at /usr/perl5/vendor_perl/5.12/Munin/Common/SyncDictFile.pm line 180.


と言われるので,SyncDictFile.pm を見てみる.

sub _lock_write {
        my ($filename, $mode) = @_;
        $mode ||= "a+";

        use Fcntl qw(:flock);
        use IO::File;

        my $fh = IO::File->new($filename, $mode)
                or die "Cannot open tied file '$filename' - $!";
        flock($fh, LOCK_EX) or die "Cannot lock tied file '$filename' - $!";
        return $fh;
}


となっていて,flock のところでこけている.

ググってみると以下のような話がみつかった

OSがSolarisの場合、flockシステムコールの仕様の違いによりpkwk_chown(): flock() failedがでることが分かりました。Solarisのflockでは、LOCK_EX(排他ロック)をするためには書き込み可能な状態でファイルをオープンする必要があります。これに対して、LinuxなどのOSでは読み出しオープンでもLOCK_EX可能です。fopen の 'r' を 'w+' に変更すると改善するのは、OSのflockがSolaris流の場合と考えられます。ただ、pkwk_chown は、書き込みできないファイルのオーナーを変更することにより、書き込み権限を得ることが本来の目的ですので、'w+' でオープンできない場合、目的を果たせなくなります。それから、PHPのposix拡張モジュールの有無も、挙動に影響します。posix拡張モジュールがあれば、ファイルのオーナーをapacheの実行ユーザに変更することで解決できますが、posix拡張モジュールが無い場合、apache実行ユーザIDの取得ができず、毎回chownしようとしますので、pkwk_chown(): flock() failedが出ます。どのように問題解決すべきか考えています(LOCK_EXできないので、ロックファイルを作って対応かな・・・)。目処が立ったら、dev:BugTrack2で改善案を提案します。 -- 三浦克介 2010-10-24 (日) 11:51:16

http://pukiwiki.sourceforge.jp/?%E8%B3%AA%E5%95%8F%E7%AE%B13%2F260


ということなので,

        my ($filename, $mode) = @_;
        $mode ||= "a+";


で,$mode に "r" が入ることがあってこけてるっぽい.

とりあえず,以下のように LOCK_SH にしてみる.

       flock($fh, LOCK_SH) or die "Cannot lock tied file '$filename' - $!";


すると,以下のように実行できた.

$ sudo -u munin /usr/share/munin/munin-asyncd -v
[6812][main] Reading config from localhost:4949
[6812][plugin:cpu] asking for config
[6812][plugin:cpu] asking for data
(snip)


排他ロックを共有ロックにしてしまっているのでよろしくないのだけど,
どうすればいいんだろう?

Perl と Solaris に詳しい人いませんかね?

Referrer (Inside):
[2013-08-17-1] Solaris 11 で Munin asyncd を使う
[2012-09-29-1] munin-async を Solaris 11 上で動かしたい 3
[2012-09-28-3] munin-async を Solaris 11 上で動かしたい 2
comments powered by Disqus