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

提供:maruko2 Note.
移動: 案内, 検索

目次

man

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 とかのエラーが出るときがあるので、PropertyListEditor.png Property List Editor.app で作るのが確実。

Label <string>
必須。ジョブラベル。launchd のジョブとして一意の名前が必要。
ProgramArguments <array of string>
必須。実行するプログラムと、オプション、引数など。
Disabled <boolean>
デフォルト: false
ジョブを使用するかしないか。デフォルトは false のため、Disabled キーが記述されていないジョブは使用することになる。
OnDemand <boolean>
デフォルト: true
要求があったときだけ起動するか、起動したまま常駐させるか。デフォルトは true なので、要求があったときだけ起動する。
false にすると常駐する。

launchd の GUI 管理アプリケーション

Lingon.png Lingon
http://lingon.sourceforge.net
Application.png Launchd Editor
http://www.codepoetry.net/products/launchdeditor

launchctl の使用例

OS ブート時に launchd が load しているジョブは、root 権限で操作する必要がある。

LaunchDaemon の起動方法

launchctl コマンドで launchd.plist ファイルをロードする。

$ launchctl load /Library/LaunchDaemons/launchd.plist
$ launchctl load -F launchd.plist
$ launchctl load -w launchd.plist

OnDemand true のジョブを使用するには

$ launchctl load /Library/LaunchDaemons/launchd.plist
$ launchctl start ジョブラベル

ジョブの再起動

$ launchctl stop ジョブラベル

ジョブの停止

$ 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
LINEで送る このエントリーをはてなブックマークに追加
個人用ツール
名前空間
変種
表示
操作
案内
ツールボックス

注目のページ

このサイトのはてなブックマーク数