anacron では指定した時刻に電源が落ちていた場合でも
次に起動した時にスクリプトが実行される
(cron では指定時刻に電源が入っていないと、そのイベントはスキップされてしまう)。
よくサスペンドしておくノートPCでは便利で、anacron 相当を launchd でやってみた。
といっても StartCalendarInterval で指定するだけ。
たとえば毎日 2:50 に ~/script/test.sh を実行する:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd" >
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.example.example</string>
<key>ProgramArguments</key>
<array>
<string>/Users/zakkie/script/test.sh</string>
</array>
<!-- 起動条件 -->
<key>StartCalendarInterval</key>
<dict>
<key>Hour</key>
<integer>2</integer>
<key>Minute</key>
<integer>50</integer>
</dict>
</dict>
</plist>
Hour, Minute の他に Day, Weekday, Month を指定可能。
これを ~/Library/LaunchAgents/example.plist として保存する。
反映は launchctl load ~/Library/LaunchAgents/example.plist 。
次回ログイン時は自動的にロードされる。
設定ファイルの置き場所は 3 種類。
- ~/Library/LaunchAgents
- ユーザ毎の設定
- /Library/LaunchAgents
- 全てのユーザに共通で適用される。
- /System/Library/LaunchAgents
- Mac OSX によって適用される。この下のファイルはいじらない方がよさそう。
また、起動条件は複数指定可能で、例えば毎時 0 分と 30 分に起動するなら、:
<key>StartCalendarInterval</key>
<array>
<dict>
<key>Minute</key>
<integer>0</integer>
</dict>
<dict>
<key>Minute</key>
<integer>30</integer>
</dict>
</array>
となる。
ちなみにスキップされたイベントが複数あっても、起動後には 1 回だけ実行される。