Furudateのブログ

プログラミングやネットワーク系の知識・技術がメインのブログ。技術メモ帳的な感じになるかと。岩手から発信していきます。

Mac(OS X)ではcronじゃなくてlaunchdでやる

こんにちは。 前にcrontabの書き方についてこちらの記事に書きましたが、Macの場合はlaunchdを使ったほうが良いみたいです。

今回はlaunchdについて書きたいと思います。

launchdとは?

launchdはデーモン、アプリケーション、プロセス、スクリプトの起動・停止・管理を行う、オープンソースのサービス管理フレームワークです。(Wikipediaより
まぁ簡単に言えばUnix系のinitやcrondの代わりをしてくれるものだと思います。 OS起動時に起動するものともいえると思います。

今回はこれをcronの代わりに使いたいと思います。

launchdのファイル構成

launchdの設定は、以下のディレクトリにlaunchd.plistを置き行います。

  • ~/Library/LaunchAgents
    各ユーザが管理するユーザごとに実行するエージェントを設定する
  • /Library/LaunchAgents
    管理者が管理する各ユーザごとに実行するエージェントを設定する
  • /Library/LaunchDaemons
    管理者が管理するシステム全体で実行するデーモンを設定する
  • /System/Library/LaunchAgents
    OS が管理するユーザごとに実行するエージェントを設定する(基本的には触らない)
  • /System/Library/LaunchDaemons
    OS が管理するシステム全体で実行するデーモンを設定する(基本的には触らない)

自分が実行したい内容によって設定ファイルを置く場所を変更します。
ちなみにエージェントは各ユーザ単位で起動されるサービスのことで、デーモンはシステム全体で一つだけ起動されるサービスのことです。

launchd.plistの記述

基本的にXMLベースで以下のように書きます。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>cycleBattery</string>
    <key>ProgramArguments</key>
    <array>
        <string>/usr/bin/ruby</string>
        <string>/Users/username/example.rb</string>
    </array>
    <key>StartCalendarInterval</key>
    <dict>
        <key>Hour</key>
        <integer>0</integer>
        <key>Minute</key>
        <integer>0</integer>
    </dict>
    <key>StandardOutPath</key>
    <string>/Users/username/output.txt</string>
</dict>
</plist>

タグの中にタグ(連想配列を表すタグ)を書き、キーとその値を順に書いていきます。

ここで使っているキーや、よく使うキーの意味は以下の様になります。

key value 意味
Lavel string 必須。管理するジョブの名前。一意にする必要がある。ファイル名から拡張子を抜いたものにするのが一般的らしいです。
ProgramArguments array of string 必須。実行するプログラムとオプション、引数などを指定する。つまりarrayタグの中に、実行したいコマンドをスペース区切りで順番にstringタグの中に書いていけば良い。
StartCalendarInterval dict 指定した日時に実行します。これがcrontabと同じような感じですね。
StandardOutPath string 実行結果(ログ)を指定したファイルに書く。デフォルトは/var/log/system.log に出力される。
StartInterval Integer 起動間隔を秒数で指定(一定時間ごとに実行)
OnDemand boolean 起動のタイミングを要求があったときにするか常駐にするか。trueにすると要求があったときのみになり、falseは常駐。デフォルトは true。

設定したファイルをlaunchdへ登録

設定ファイルを書き終えたら、後はそれをlaunchdへで登録します。コマンドはlaunchctlです。

$ launchctl load ~/Library/LaunchAgents/example.plist
$ launchctl list
-   0   example
$ launchctl unload ~/Library/LaunchAgents/example.plist

loadで登録、unloadで登録解除です。修正した場合は、一度unloadしてからloadして再読み込みします。
また、listで登録したものを確認することが出来ますが、多分多いのでgrepとかで絞り込んで見ると良いと思います。

以上です。
それでは。

参考にさせていただいたサイト

launchdをcronの代わりに使うための簡易メモ - Mekajikiの日記

LaunchDaemons (launchctl, launchd.plist) の使い方 - maruko2 Note.

OS X の Launchd を cron の替わりに利用する | Lonely Mobiler

launchd を使ってスクリプトを自動実行してみた