Linux などでは、(ユーザではなくという意味で)システム側からのプロセス起動という意味では、init、cron、(x?)inetd、rc.d などというように、いくつかタイプがある。当然、それぞれのコンフィグは異なる場所に配置されるし、そのフォーマットも非互換です。それぞれのプロセスを学ぶにはそれなりの学習コストがかかり、その学習コストを支払い終えるまで、その設定はセキュリティリスクにすらさらされます。launchd は、このような状況を改善するために、システム起動用の統一化されたインターフェイスを提供するために、生まれたのだと理解しています。
で、今日ちょっと cron ジョブを追加する必要に迫られたのですが、Mac においては上述の通り、時刻起動のジョブについても cron ではなく launchd を使うことが「preferred」です。というわけで launchd で時刻定期実行ジョブを作ることにしました。
ちなみに、cron による時刻起動と launchd による時刻起動の大きな違いは以下の 2 つです。 -launchd の設定ファイルはシステム毎(あるいはユーザ毎)ではなくジョブ毎。そのため、ジョブの追加/削除が他ジョブに影響を与えない。 -指定時刻にコンピュータがスリープあるいはシャットダウンされていた場合、launchd は当該ジョブを次のシステム起動時に実行する。その意味で、cron というよりは anacron に近い。
**Sample ここでは、port selfupdate を launchd にて実現してみます。 ファイル名は、com.kiririmode.port.selfupdate としました。launchd 用の plist は慣習として、
あとは、launchd.plist の規則に従って、設定をしていくだけです。定期実行の場合、その実行時刻の設定は、StartCalendarInterval を使えます。設定項目は、cron と代わるところがないため、迷う必要もないかと思います。
|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">
||< 反映は launchctl で。 |tcsh| $ sudo launchctl unload /Library/LaunchAgents/com.kiririmode.port.selfupdate.plist $ sudo launchctl load /Library/LaunchAgents/com.kiririmode.port.selfupdate.plist ||< よくよく考えてみると、/etc/periodic/daily にスクリプトを追いとけば良かったんじゃね?という話ではある。 Label com.kiririmode.port.selfupdate UserName root ProgramArguments /opt/local/bin/port selfupdate StartCalendarInterval Hour 01 Minute 00 EnvironmentVariables HOME /var/tmp
**ref -System Startup Programming Topics -launchd.plist
*1:あくまで慣習