LaunchDaemons (launchctl, launchd.plist) の使い方
目次 |
man
launchctl
-- Interfaces with launchd -- launchctl(1) OS X Manual Pagelaunchd.plist
-- System wide and per-user daemon/agent configuration files -- launchd.plist(5) OS X Manual Pagelaunchd
-- System wide and per-user daemon/agent manager -- launchd.plist(5) OS X Manual Pageplutil
-- property list utility -- plutil(1) OS X Manual Pageplist
-- property list format -- plist(5) OS X Manual Page
Daemon と Agent の違い
- Daemon
- OS 起動時に、PID 1 の launched によって起動されるプログラム。
- Agent
- ユーザ権限で起動する launched によって起動されるプログラム。Agent は GUI インターフェースを持つことができるが、Daemon はそれができない。
launchd.plist ファイルを置くディレクトリ
通常は、/Library/LaunchDaemons に launchd.plist ファイルを置く。
~/Library/LaunchAgents /Library/LaunchAgents /Library/LaunchDaemons /System/Library/LaunchAgents /System/Library/LaunchDaemons
launchd.plist の記述例
/System/Library/LaunchDaemons/com.apple.periodic-daily.plist
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>Label</key> <string>com.apple.periodic-daily</string> <key>ProgramArguments</key> <array> <string>/usr/sbin/periodic</string> <string>daily</string> </array> <key>LowPriorityIO</key> <true/> <key>Nice</key> <integer>1</integer> <key>StartCalendarInterval</key> <dict> <key>Hour</key> <integer>3</integer> <key>Minute</key> <integer>15</integer> </dict> </dict> </plist>
man に <key> の詳細が書かれている。man launchd.plist
テキストエディタで書いてもいいが、launchctl で load する時に propertyList is NULL とかのエラーが出るときがあるので、 Property List Editor.app で作るのが確実。
- Label <string>
- 必須。ジョブラベル。launchd のジョブとして一意の名前が必要。
- ProgramArguments <array of string>
- 必須。実行するプログラムと、オプション、引数など。
- Disabled <boolean>
- デフォルト: false
- ジョブを使用するかしないか。デフォルトは false のため、Disabled キーが記述されていないジョブは使用することになる。
- OnDemand <boolean>
- デフォルト: true
- 要求があったときだけ起動するか、起動したまま常駐させるか。デフォルトは true なので、要求があったときだけ起動する。
- false にすると常駐する。
launchd の GUI 管理アプリケーション
- Launchd Editor
- http://www.codepoetry.net/products/launchdeditor
launchctl の使用例
OS ブート時に launchd が load しているジョブは、root 権限で操作する必要がある。
LaunchDaemon の起動方法
launchctl コマンドで launchd.plist ファイルをロードする。
- load, unload するときは launchd.plist の指定をファイルパス(フルパス)で行う必要がある。
$ launchctl load /Library/LaunchDaemons/launchd.plist
- Disabled キーが false、あるいは、Disabled キーの記述が無い場合は、そのジョブを使用することなので、load できる。
- Disabled キーが true の場合、そのジョブを使用しないことなので、-F オプションを付けると強制的に load できる。
$ launchctl load -F launchd.plist
- load 時に -w オプションを付けると、Disabled キーを削除して load する。つまり、Disabled キーに関係なく使用することになる。(OSブート時に自動起動するようになる。)
$ launchctl load -w launchd.plist
- OnDemand true のジョブは load するのみ。
OnDemand true のジョブを使用するには
- load した後、launchd.plist に記述してある Label キーの <string>(ジョブラベル)を指定して start する。
$ launchctl load /Library/LaunchDaemons/launchd.plist $ launchctl start ジョブラベル
ジョブの再起動
$ launchctl stop ジョブラベル
- ジョブラベルは、<launchd>.plist に記述してある Label キーの <string> のこと。
- OnDemand false のジョブは常駐する設定なので、stop すると停止後すぐに起動する(つまり、再起動する)。
- launchd.plist を修正した場合、stop で再起動しても launchd.plist の内容は反映されない。一度 unload して、再度 load する必要がある。
ジョブの停止
$ launchctl unload /Library/LaunchDaemons/launchd.plist
launchd.plist の修正内容を反映させる
launchd.plist を修正した場合、stop で再起動しても launchd.plist の内容は反映されない。一度 unload して、再度 load する必要がある。
$ launchctl unload ジョブラベル $ launchctl load /Library/LaunchDaemons/launchd.plist
オプション例
launchctl load -w <launchd.plist path> | <key>Disabled</key> キーを削除し launchd.plist をロードする。 OSブート時に自動起動するようになる。 |
---|---|
launchctl load -F <launchd.plist path> | <key>Disabled</key> キーがあっても強制的に launchd.plist をロードする。 |
launchctl unload <launchd.plist path> | launchd.plist をアンロードする。 |
launchctl unload -w <launchd.plist path> | launchd.plist に <key>Disabled</key><true/>を追記し、アンロードする。 OSブート時に自動起動しないようになる。 |
launchd にロードされている job の一覧
OS ブート時に launchd がロードしているジョブは、root 権限で操作する。
$ sudo launchctl list com.apple.dashboard.advisory.fetch com.apple.dnbobserverd ...
ASCII 形式の plist ファイルから XML 形式の plist ファイルを作成する
XML 形式の plist ファイルを書く時、XML タグをいちいち書くのは面倒なので、まず ASCII 形式 (old style) で書き、それを XML 形式にコンバートすることで、少し楽に書くことができる。
plist ファイルの形式をコンバートするには、plutil コマンドを使用する。
LaunchDaemons ディレクトリに置く plist ファイルは XML 形式でないとうまく動作しない。 |
XML 形式と同じ内容を ASCII 形式で書いた場合、下記のようになる。
ASCII 形式の方が少ない記述ですむし、見通しも良くなる。
- XML 形式
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>Disabled</key> <false/> <key>GroupName</key> <string>staff</string> <key>Label</key> <string>boinc</string> <key>OnDemand</key> <false/> <key>ProgramArguments</key> <array> <string>/Applications/BOINC/boinc</string> <string>-dir</string> <string>/Applications/BOINC/</string> <string>-daemon</string> <string>-redirectio</string> </array> <key>UserName</key> <string>admin</string> </dict> </plist>
- ASCII 形式 (old style)
{ Disabled = 0; GroupName = staff; Label = boinc; OnDemand = 0; ProgramArguments = ( "/Applications/BOINC/boinc", "-dir", "/Applications/BOINC/", "-daemon", "-redirectio" ); UserName = admin; }
ASCII 形式で記述後、plutil コマンドを使い XML 形式にコンバートする。
$ plutil -convert xml1 <plist ファイル>
-convert xml1 オプションを付けることで、plist ファイルを XML 形式にコンバートすることができる。 ただし、このコマンドでは上書きすることになるので、上書きしないようにするには、-o オプションを付ける。
$ plutil -convert xml1 <ASCII 形式 plist ファイル> -o <XML 形式 plist ファイル>
plutil コマンドでは、ASCII形式 -> XML形式 への変換はできるが、XML形式 -> ASCII形式 への変換はできない。 |
plist ファイルをバイナリ形式で作成することもできるようだが、Property List Editor.app で開き保存することで バイナリ形式以外に書き出せるため、あまり意味はない。(はず。)
実例
syslog サーバを再起動
syslogd デーモンが起動しているにもかかわらず、ログ (/var/log/secure.log など) が追加されていかない。 syslogd デーモンを再起動する。
launchctl で stop すると com.apple.syslogd は、常駐する設定になっているため、自動で再起動される。
$ sudo launchctl stop com.apple.syslogd
設定の再読み込み
syslogd の起動設定 (/System/Library/LaunchDaemons/com.apple.syslogd.plist) を編集した場合、設定を再読み込みする場合は一度 unload してから load する必要がある。
$ sudo launchctl unload /System/Library/LaunchDaemons/com.apple.syslogd.plist $ sudo launchctl load /System/Library/LaunchDaemons/com.apple.syslogd.plist
ただし、/etc/syslog.conf を編集した場合は、stop で syslogd の再起動をするだけでよい。
$ sudo launchctl stop com.apple.syslogd
Apple の資料
- Getting Started with launchd
- http://developer.apple.com/macosx/launchd.html
- System Startup Programming Topics
- http://developer.apple.com/documentation/MacOSX/Conceptual/BPSystemStartup/index.html