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> の詳細が書かれている。launchd.plist (5)

テキストエディタで書いてもいいが、launchctl で load する時に propertyList is NULL とかのエラーが出るときがあるので、Image: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 管理アプリケーション

image:Lingon.png Lingon
http://lingon.sourceforge.net
image:Application.png 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 コマンドを使用する。

Note

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 ファイル>

Note

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
表示
個人用ツール
Googleサイト内検索
はてなブックマーク

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

はてなブックマークに追加 はてなブクマに追加

Ad