cron に別れを告げ launchd と共に過ごそう、今さら

Mac OS X では cron は launchd にキックされる扱いなので launchd マジお勧め、ということは知ってはいたのだけど、今まで Mac 側で cron っぽいことをやる必要がなかったのでスルーしていました。が NetBSD に別れを告げるにあたり、今まで NetBSD でやってたことは全部 Lion Server で同じようにやりたい。もちろん cron はそのまま動くのだけど、せっかく OS が変わるのだからその流儀に従おう、ということで今さら launchd を使うことにしました。

参考にしたのは下記のサイト。

thanks a lot!!

移行してみたのは相変わらずお世話になりっぱなしというかないと生活できないレベルの pkgsrc の更新。 crontab にはこんな感じ

30 5 * * 1-6 cd /usr/src/pkgsrc && cvs update -P -d > /dev/null 2>&1

で書いてますが、これを launchd 形式に書き直します。
ポイントとしては

  1. ユーザー権限で実行
  2. メールがウザいので stdout/stderr は /dev/null 送り

でしょうか。

ということで参考サイトを見ながら適当に xml を書いてみる、とこんな感じ

<?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.src.pkgsrc</string>
    <key>ProgramArguments</key>
    <array>
        <string>/usr/bin/cvs</string>
        <string>update</string>
        <string>-Pd</string>
    </array>
    <key>WorkingDirectory</key>
    <string>/Volumes/pkgsrc/src/pkgsrc</string>
    <key>StartCalendarInterval</key>
    <dict>
        <key>Hour</key>
        <integer>3</integer>
    </dict>
</dict>
</plist>

これを適当な名前(ラベルに準じて jp.hyrule.flora.src.pkgsrc.plist )で ~/Library/LaunchAgents/ に保存して

launchctl load ~/Library/LaunchAgents/jp.hyrule.flora.src.pkgsrc.plist

とやると登録完了。… launchd がきめ細かな設定ができるとはいえ cron の御手軽さも捨てがたいものはありますな(無理に lanuchd を使わなくてもいいだろうという話もある)
手間取ったところは

Program
If this key is missing, then the first element of the array of strings provided to the ProgramArguments will be used instead.

というあたり? Program はなんのために定義されているんだというか、 ProgramArguments の最初の要素がプログラム扱いというのは微妙に気持ち悪い。

で、これを登録して放置してたら /var/log/system.log に

Jul 29 03:09:55 flora jp.hyrule.flora.src.pkgsrc[87752]: cvs update: Updating .

とか表示されちゃって厭ん。何が悪いかってーとポイント 2 番目の /dev/null を忘れちゃったからなんですね。

ということでこんな感じに修正

<?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.src.pkgsrc</string>
        <key>ProgramArguments</key>
        <array>
                <string>/usr/bin/cvs</string>
                <string>update</string>
                <string>-Pd</string>
        </array>
        <key>WorkingDirectory</key>
        <string>/Volumes/pkgsrc/src/pkgsrc</string>
        <key>StartCalendarInterval</key>
        <dict>
                <key>Hour</key>
                <integer>3</integer>
        </dict>
        <key>StandardOutPath</key>
        <string>/dev/null</string> 
        <key>StandardErrorPath</key> 
        <string>/dev/null</string>
</dict>
</plist>

言うまでもなく赤字が変更部分。で system.log には吐かれなくなりました。

この StandardOutPath や StandardErrorPath で STDOUT や STDERR の吐き先を変えられるってのは syslogd 経由せずに好きなところにログっぽいものを書き出せるので、地味に便利かもしれない。

3 thoughts on “cron に別れを告げ launchd と共に過ごそう、今さら

コメントを残す