なにを使おう?
Macでタスクやスクリプトを定期的に実行させたいけど、どういう方法があるだろう?
まずLinuxなどで利用するcronを使用しようと思ったがOS Xでは非推奨みたい。
そこで、今回はlaunchdを利用してスクリプトの自動実行を検討してみる。
launchdとは?
launchdはデーモン、アプリケーション、プロセス、スクリプトの起動・停止・管理を行う、オープンソースのサービス管理フレームワークである。
Linuxのcron、Windowsのタスクスケジューラに相当する機能だと考えれば良さそう。
設定してみる
スクリプトを用意
今回はテストとして特定のディレクトリのファイルを特定のディレクトリへコピーするスクリプトを作成し、それをlaunchdで定期的に実行させる。
スクリプトの保存場所はどこでもいいと思うが、仮に下記のディレクトリに保存する。
vi /Users/Me/scripts/copy.sh
copy.sh
#!/bin/bash cp -R コピー元 コピー先
launchdの設定ファイルを作成
launchdの設定はプロパティリストファイル(.plist)で定義する。
設定ファイルの配置場所は用途によって異なる。
配置場所 | 用途 |
---|---|
~/Library/LaunchAgents | 各ユーザが管理するエージェントを設定 |
/Library/LaunchAgents | 管理者が管理するエージェントを設定 |
/Library/LaunchDaemons | 管理者が管理するデーモンを設定 |
/System/Library/LaunchAgents | OSが管理するエージェントを設定 |
/System/Library/LaunchDaemons | OSが管理するデーモンを設定 |
今回は ~/Library/LaunchAgents に配置しようと思う。
vi ~/Library/LaunchAgents/com.no-title.copy.plist
毎日9時半にスクリプト(copy.sh)を実行させる場合、下記のように記述する。
Label com.no-title.copy ProgramArguments sh /Users/Me/scripts/copy.sh StartCalendarInterval Minute 30 Hour 9 StandardOutPath /Users/Me/scripts/copy.log StandardErrorPath /Users/Me/scripts/copy.log
キー | 内容 |
Label | サービスを識別するラベル |
ProgramArguments | 起動するサービスのパス及び引数を指定 |
StartCalendarInterval | 実行日時を指定 |
StandardOutPath | 標準出力ログの出力先 |
StandardErrorPath | 標準エラーログの出力先 |
launchdへの登録
設定ファイルが記述できたら、さっそく登録してみましょう
launchctl load ~/Library/LaunchAgents/com.no-name.copy.plist
確認
登録を確認するには下記のコマンドを実行します。
指定するのはlabel名です。
launchctl list com.no-title.copy
登録解除
登録を解除する場合は下記のコマンドを実行します。
launchctl unload ~/Library/LaunchAgents/com.no-name.copy.plist
参考
Mac OS Xでlaunchdでcronのように定期実行するメモ – launchd.plistの作成とか – tweeeetyのぶろぐ的めも
launchctl unload ~/Library/LaunchAgents/pl.sample.perl.plist …
launchd.plistの書き方 | Drowsy Dog’s Diary
launchd の設定ファイル …
Undocumented Mac OS X:第1回 initを置き換えるlaunchd【前編】 (3/3) – ITmedia エンタープライズ