2010年1月10日日曜日

mac: launchd で anacron っぽいことをする

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 回だけ実行される。

0 件のコメント:

コメントを投稿