Mac OS X では cron は launchd にキックされる扱いなので launchd マジお勧め、ということは知ってはいたのだけど、今まで Mac 側で cron っぽいことをやる必要がなかったのでスルーしていました。が NetBSD に別れを告げるにあたり、今まで NetBSD でやってたことは全部 Lion Server で同じようにやりたい。もちろん cron はそのまま動くのだけど、せっかく OS が変わるのだからその流儀に従おう、ということで今さら launchd を使うことにしました。
参考にしたのは下記のサイト。
- cronからlaunchdへ(より効率的なジョブ管理を目指して)
- launchd(8)
- Mac OS X launchd plist StartInterval and StartCalendarInterval examples
thanks a lot!!
移行してみたのは相変わらずお世話になりっぱなしというかないと生活できないレベルの pkgsrc の更新。 crontab にはこんな感じ
30 5 * * 1-6 cd /usr/src/pkgsrc && cvs update -P -d > /dev/null 2>&1
で書いてますが、これを launchd 形式に書き直します。
ポイントとしては
- ユーザー権限で実行
- メールがウザいので 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 経由せずに好きなところにログっぽいものを書き出せるので、地味に便利かもしれない。
「cron に別れを告げ launchd と共に過ごそう、今さら」への3件の返信
“cron に別れを告げ launchd と共に過ごそう、今さら | 不定期な記録” http://t.co/8xBhHIWV
[B!] 知らなんだ。めも。 http://t.co/JcA5k6qQ cron に別れを告げ launchd と共に過ごそう、今さら | 不定期な記録
自分的に衝撃的事実.MacだとTigerのころから普通らしい・・・. http://t.co/McoVAScO