考えてみりゃ当たり前だよな、と思うのだけど、ちょーハマったのでもしかしたら同じようにハマってる人の役に立つかもしれないのでメモ。
NetBSD では cron で
@reboot /path/to/madoka4.2/madoka.sh
と起動時に irc 常駐ソフトのまどかちゃんが動くように設定していました。
なので、これもこないだ書いたように plist を書いて Lion Server では cron ではなく launchd 配下で動作するようにしましょう、とこんな感じに plist を書きました。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>Label</key> <string>jp.hyrule.flora.irc.madoka</string> <key>Disabled</key> <false/> <key>ProgramArguments</key> <array> <string>/usr/bin/perl</string> <string>/path/to/Server/madoka/madoka.pl</string> <string>-rc</string> <string>/path/to/Server/madoka/madoka.rc</string> </array> <key>WorkingDirectory</key> <string>/path/to/Server/madoka</string> <key>KeepAlive</key> <true/> <key>StandardOutPath</key> <string>/dev/null</string> <key>StandardErrorPath</key> <string>/dev/null</string> </dict> </plist>
で、
launchctl load ~/Library/LaunchAgents/jp.hyrule.flora.irc.madoka.plist
としたところ、どうもまどかちゃんが動いていないご様子。というか /var/log/system.log を除いてみたら
Aug 7 20:25:32 flora com.apple.launchd.peruser.1001[290] (jp.hyrule.flora.irc.madoka): Throttling respawn: Will start in 10 seconds
というメッセージが並んでいる始末。
なんじゃこりゃー、と “Throttling respawn” でぐぐってみたところ、どうも plist が間違っている場合に吐かれるメッセージらしいんだけど、これだ、というような解決策は見当たらず。手で動かす分には問題なく動いてるのになんでー、ということで stdout や stderr にファイル指定してみたり、 perl を変えてみたり、 madoka.pl を直接実行してみたり、 NetBSD で使っていた自分で書いたシェルスクリプトにしてみたりしたのだけど、全部アウト。これは一体なにが悪いんだ!? と泣きそうになりながら改めて madoka.pl を読んで、試してなかった -nofork オプションを指定してみたら…ようやく動きだしたのです。
NetBSD や FreeBSD では Daemon というか常駐して動き続けるプログラムは裏に回すのが当然なのですが、 launchd 配下で動くプログラムは launchd が監視し続けてるので勝手に裏に回られては困るのでこんなエラーを吐くようになって動かないのかなぁ、とか想像。
ということで目出度く動くようになった plist はこんなです。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/
PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>jp.hyrule.flora.irc.madoka</string>
<key>Disabled</key>
<false/>
<key>ProgramArguments</key>
<array>
<string>/usr/bin/perl</string>
<string>/path/to/Server/madoka/madoka.pl</string>
<string>-rc</string>
<string>/path/to/Server/madoka/madoka.rc</string>
<string>-nofork</string>
</array>
<key>WorkingDirectory</key>
<string>/path/to/Server/madoka</string>
<key>KeepAlive</key>
<true/>
<key>StandardOutPath</key>
<string>/dev/null</string>
<key>StandardErrorPath</key>
<string>/dev/null</string>
</dict>
</plist>