macOSで決まった時刻にプログラムを実行させたいので、UNIXやLinuxのcron、Windowsのタスクスケジューラに相当する機能がないか調べた。
Mac Developer Libraryを覗くと、Scheduling Timed Jobsにジョブに関する記述があり、まとめると以下のようになる。
- プログラムを定時実行させる場合は、launchdジョブとcronジョブが使える
- 好ましいのはlaunchdのジョブを使うことである。cronは非推奨だ
launchdジョブの定義
launchdジョブはプロパティリストファイル(.plist)で定義する。記述方法はA launchd Tutorialをはじめとするリンクを参考資料にまとめたので、そちらをみてほしい。
launchdジョブの配置場所
launchdジョブは用途によって設置場所が異なる。
配置場所 | 用途 |
---|---|
~/Library/LaunchAgents | 各ユーザが管理するエージェントを設定 |
/Library/LaunchAgents | 管理者が管理するエージェントを設定 |
/Library/LaunchDaemons | 管理者が管理するデーモンを設定 |
/System/Library/LaunchAgents | OSが管理するエージェントを設定 |
/System/Library/LaunchDaemons | OSが管理するデーモンを設定 |
デーモンはシステムレベルで実行されるジョブのことを指す。従ってroot権限を必要とする。そして、LaunchDaemonsディレクトリはユーザディレクトリには存在しない。エージェントはログインしているユーザ毎に実行されるジョブを指す。
例えば、特定のユーザ用のジョブなら、下記のようにコマンドを実行する。
実行したlaunchdジョブのログ
実行結果は、原則として/var/log/system.logに出力される。
ジョブを定義したプロパティリストで変更ができる。