Macで定期実行する場合、cronではなくlaunchdを使ったほうが良いと言われています。これはlaunchdの豊富な機能が使えることやスタートアップのデーモンなどと一緒に一元管理できることなどが理由だと思います。しかし、launchdは、XMLの読み辛い書式や、編集毎のlaunchctrl load/unloadの手間、成功/失敗の判断、デバッグが難しいなど、触ってみて挫折した人も多いのではないでしょうか。
私はギリギリのところでLaunchControlという有償のGUIツールを発見して、挫折を免れました。このツールが非常に便利だったので簡単に紹介します。これを使い始めてから、launchdが好きになりました。
環境
- OS X El Capitan 10.11.3
使い方
画面の説明
左ペイン: ~/Library/LaunchAgentsに配置してある各タスク
中ペイン: タスクの詳細
右ペイン: launchdの設定
タスクの追加
左下の+ボタンからタスクを追加します。追加後、右ペインから各設定をドラッグアンドドロップで追加できます。追加した設定が誤っている場合は警告が表示されます。
このGIFで作成したタスクは以下の内容で保存されています。
<?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>local.job</string>
<key>ProgramArguments</key>
<array>
<string>echo</string>
<string>helloworld</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>StandardErrorPath</key>
<string>/tmp/local.job.stderr</string>
<key>StandardOutPath</key>
<string>/tmp/local.job.stdout</string>
</dict>
</plist>
タスクの実行
左ペインからタスクを選択してCommand+Shift+Tでタスクを実行できます。これは launchctl start
と同じです。
上記のGIFで作成したlocal.helloworldを実行した場合、stdoutのパスに結果が出力されています。
$ cat /tmp/local.job.stdout
helloworld