June 13, 2015

macOSで定刻にプログラムを実行させる

macOSで決まった時刻にプログラムを実行させたいので、UNIXやLinuxのcron、Windowsのタスクスケジューラに相当する機能がないか調べた。Mac Developer Libraryを覗くと、Scheduling Timed Jobsにジョブに関する記述があり、まとめると以下のようになる。

  • プログラムを定時実行させる場合は、launchdジョブとcronジョブが使える
  • 好ましいのはlaunchdのジョブを使うことである。cronは非推奨だ

launchdジョブの定義

launchdジョブはプロパティリストファイル(.plist)で定義する。記述方法はA launchd Tutorialをはじめとするリンクを参考資料にまとめたので、そちらをみてほしい。

launchdジョブの配置場所

launchdジョブは用途によって設置場所が異なる。

launchdジョブ定義ファイルの配置場所

配置場所 用途
~/Library/LaunchAgents 各ユーザが管理するエージェントを設定
/Library/LaunchAgents 管理者が管理するエージェントを設定
/Library/LaunchDaemons 管理者が管理するデーモンを設定
/System/Library/LaunchAgents OSが管理するエージェントを設定
/System/Library/LaunchDaemons OSが管理するデーモンを設定

デーモンはシステムレベルで実行されるジョブのことを指す。従ってroot権限を必要とする。そして、LaunchDaemonsディレクトリはユーザディレクトリには存在しない。エージェントはログインしているユーザ毎に実行されるジョブを指す。

例えば、特定のユーザ用のジョブなら、下記のようにコマンドを実行する。

$ launchctl load ~/Library/LaunchAgents/com.hiroakit.hoge.plist # 登録
$ launchctl list com.hiroakit.hoge # 確認
$ launchctl unload ~/Library/LaunchAgents/com.hiroakit.hoge.plist # 登録解除

実行したlaunchdジョブのログ

実行結果は、原則として/var/log/system.logに出力される。

ジョブを定義したプロパティリストで変更ができる。

参考資料