tweeeetyのぶろぐ的めも

アウトプットが少なかったダメな自分をアウトプット<br>\(^o^)/

Mac OS Xでlaunchdでcronのように定期実行するメモ - launchd.plistの作成とか

はじめに

macでcronのように定期実行したい時のメモです。

自分はvirtual boxやvmwareなどのゲストOS上で作ったファイルやログを
ホストのmacに定期的にもってきたい(もしくは同期したい)というケースがありました。

ゲスト側でcron設定してrsyncも考えたのですが
ゲストがn台に増えた時に下記の感じが面倒でした。

  • ゲストn台すべてにホストに対してrsyncするような設定やスクリプトを置いて管理する必要がある
  • ゲストOSからホストのMAC対するネットワーク設定(ssh設定)などが面倒。n台あるとさらに。

そういうことでmac側で設定します。
たまたまこういった用途がありましたが、そうじゃなくてもmacで定期実行したいってことはありそうですしね。

あじぇんだ

  1. launchdとは
  2. launchdで定期実行するまでの概要
  3. launchdで定期実行するサンプルスクリプト
  4. launchd.plistの作成
  5. launchdへの定期実行の登録/編集/取消と確認
  6. 動いたか確認
  7. 補足(管理権限やら

1. launchdとは

launchdはデーモン、アプリケーション、プロセス、スクリプトの起動・停止・管理を行う、オープンソースのサービス管理フレームワークである。

と、wiki先生のまま載せましたが、なんだかなんだ詳細は参考サイトを載せて手抜きします

2. launchdで定期実行する概要

今回は自分で作ったスクリプトを定期実行したいという例での概要になります。

おおまかにはこんな感じになります

  1. サンプルスクリプトを用意
  2. launchd.plistという設定ファイルを所定の場所におく
  3. 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のように定期実行したいときのメモでした!