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