はじめに
macでcronのように定期実行したい時のメモです。
自分はvirtual boxやvmwareなどのゲストOS上で作ったファイルやログを
ホストのmacに定期的にもってきたい(もしくは同期したい)というケースがありました。
ゲスト側でcron設定してrsyncも考えたのですが
ゲストがn台に増えた時に下記の感じが面倒でした。
そういうことでmac側で設定します。
たまたまこういった用途がありましたが、そうじゃなくてもmacで定期実行したいってことはありそうですしね。
あじぇんだ
- launchdとは
- launchdで定期実行するまでの概要
- launchdで定期実行するサンプルスクリプト
- launchd.plistの作成
- launchdへの定期実行の登録/編集/取消と確認
- 動いたか確認
- 補足(管理権限やら
1. launchdとは
launchdはデーモン、アプリケーション、プロセス、スクリプトの起動・停止・管理を行う、オープンソースのサービス管理フレームワークである。
と、wiki先生のまま載せましたが、なんだかなんだ詳細は参考サイトを載せて手抜きします
2. launchdで定期実行する概要
今回は自分で作ったスクリプトを定期実行したいという例での概要になります。
おおまかにはこんな感じになります
- サンプルスクリプトを用意
- launchd.plistという設定ファイルを所定の場所におく
- launchctlコマンドで定期実行の登録
ってことで次がからが作業ですね
3. launchdで定期実行するサンプルスクリプト
こちらはlaunchdに直接は関係ありませんが、
何か定期実行するサンプルがないと定期的に動いたかわからないので今回はこんなperlを作りました。
実行するたびに現在時刻をファイルに追記するだけのスクリプト
sample.pl
2行だけですが定期実行の確認には問題ないですね。
同じディレクトリ内にsample.txtというファイルに追記します
補足
ちなみに冒頭でも書きましたが、
定期実行するスクリプトやらを一カ所で管理したかったので
ホームディレクトリ以下にディレクトリをきりました。
※ ホームディレクトリにスクリプト置き場を用意 # pwd /Users/hoge # mkdir script ※ 定期実行スクリプトを慣れ親しんだ名前のディレクトリにまとめる # mkdir script/cron ※ 上記のperlを作成 # vi sample.pl ※ 何度か実行して確認 # perl sample.pl # perl sample.pl # perl sample.pl # cat sample.txt 2015年 1月 6日 火曜日 20時08分34秒 JST 2015年 1月 6日 火曜日 20時08分35秒 JST 2015年 1月 6日 火曜日 20時08分36秒 JST
これで定期実行するスクリプトが用意できました。
4. launchd.plistの作成
次はlaunchd.plistを作成します。
これはcrontabでいうところのcrontab -e
的な作業ですね。
launchd.plistの作成場所
下記のディレクトリ以下に作成します。作成場所については後述で補足します。
~/Library/LaunchAgents
さっそく作っちゃう
とりあえず作っちゃいます
# vi ~/Library/LaunchAgents/pl.sample.perl.plist
pl.sample.perl.plistの中身
keyについて
key名 | 説明 |
---|---|
Label | launchd のジョブの名前。慣例?でファイル名もLabel.plistという名前がいいぽい |
ProgramArguments | 実行するプログラムとオプションや引数をarrayノードで指定 |
RunAtLoad | trueの場合はlaunchd に launchd.plist がロードされたタイミングで起動 |
StandardOutPath | 標準出力ログの場所。指定がないと/var/log/system.log |
StandardErrorPath | 標準エラーログの場所。 |
StartCalendarInterval | 実行日時のカレンダー指定 |
StartInterval | カレンダー指定ではなくインターバル指定したいときはこちらを使用 |
その他のkeyもたくさんあるようなので下記に参考を載せておきます
5. launchdへの定期実行の登録/編集/取消と確認
登録
# launchctl load ~/Library/LaunchAgents/pl.sample.perl.plist
確認
# launchctl list pl.sample.perl { "Label" = "pl.sample.perl"; "LimitLoadToSessionType" = "Aqua"; "OnDemand" = true; "LastExitStatus" = 0; "TimeOut" = 30; "StandardOutPath" = "/dev/null"; "StandardErrorPath" = "/dev/null"; "ProgramArguments" = ( "perl"; "/Users/hoge/script/cron/sample.pl"; ); };
編集/取消
取消はunloadで行う。
編集した場合も、一度unloadしてからloadする
# launchctl unload ~/Library/LaunchAgents/pl.sample.perl.plist
6. 動いたか確認
これはもう単純に時間がたってからcatしてみるだけですが一応。
# pwd /Users/hoge/script/cron # cat sample.txt 2015年 1月 6日 火曜日 20時08分34秒 JST 2015年 1月 6日 火曜日 20時08分35秒 JST 2015年 1月 6日 火曜日 20時08分36秒 JST Tue Jan 6 21:52:04 JST 2015 Tue Jan 6 21:52:16 JST 2015 Tue Jan 6 21:52:27 JST 2015 Tue Jan 6 21:52:37 JST 2015
無事30秒ごとに出てます。
フォーマットが変わっちゃってますが定期実行されてることが確認できたので気にしないw
7. 補足(管理権限やら
置き場所で、実行されるユーザの管理やらができるらしい。
全員共通で起動するものを/Library
、特定ユーザのみで動作するものを~/Library
に置くみたいな。
参考サイトのままですがこんな感じらしいです。
場所 | 説明 |
---|---|
~/Library/LaunchAgents | 各ユーザが管理する各ユーザユーザごとに実行するエージェントの格納ディレクトリ |
/Library/LaunchAgents | 管理者が管理するする各ユーザごとに行するのエージェントの格納ディレクトリ |
/Library/LaunchDaemons | 管理者が管理するシステムで実行するデーモンの格納ディレクトリ(ログイン状態に依らない) |
/System/Library/LaunchAgents | OS が管理する各ユーザごとに実行するエージェントの格納ディレクトリ(基本的には触らない) |
/System/Library/LaunchDaemons | OS が管理するシステムで実行するデーモンの格納ディレクトリ(基本的には触らない) |
まとめ
ってことで、思ったよりも長くなって疲れましたが
macでcrontabのように定期実行したいときのメモでした!