macでdaemonを動かす

はじめに

やろうと思ったのは単純なことです.普段使ってるmac miniでircdを動かそう.先日参加したShibuya.pm TechTalk#7でircが活躍してたことを自社でしゃべっていて,ircを使ったことのある人がほとんどいないことに気がついたからでした.ngIRCd: Next Generation IRC Daemonをダウンロードしてインストール.ここまではすぐだったのですが,そこではたと困りました.

/etc/rc[0-6S].dなんてない

macosxFreebsdベース,そんな気分でいつも使っているのですが,os起動時の処理はinitdではなくlaunchdが動きます.つまり,ブート時にアプリケーションを起動させるために,/etc/rc2.dに起動スクリプトを放り込む,などという手順が使えないのです.

失敗の軌跡

まずやってみたのが/System/Library/LaunchDaemonsにorg.ngircd.plistという名前のファイルを見ようみまねで作ってみることでした.launchd, launchd.plist, launchctlなどのマニュアルも見ながら作ったみたもののうまくいかず挫折しました.作っている限りでは,従来inetd.confで制御していたようなプログラムを動かすための設定という気がしたんですが確証は持てません.そこで方針転換しました.普段daemonだと思って使うプロセスの起動方法がどこに書いてあるのかを探したのです.

SystemStarter

/System/Library/ディレクトをざっと見ていて,StartupItemsというディレクトリを見つけました.その中にあったのがApacheディレクトリ.そういえば,launchdマニュアルのNOTESの項にこんな記述がありました.

In Darwin it is preferable to have your daemon launch via launchd instead of modifying rc or creating a SystemStarter Startup Item.

Startup Itemというのがキーワードのようなのであたりをよく読んでみると,SEE ALSOの項でSystemStarter(8)が紹介されています.そこでこれ開いてみると,どうやらあたりです.でも,肝心なStartupItems用の書き方がありません.でぐぐってみて(googleぐぐるという使い方はgoogle社的にokらしい)Ideas - O'Reilly Mediaというページを見つけました.なんか適当に作ってるっぽい.じゃあ私もってことで作ってみました.

Ngirc

ここからは,試行錯誤の結果をあっさりと解説します.まず/System/Library/StartupItems配下にNgircというディレクトリを作りました.ホントはユーザデーモンだから/Library/StartupItemsを作ってその配下に置くんだろうけど,初めての経験なんでパスしました.子飼さんにユーザが/System/Library配下を触らない方がよいという指摘を受けたので,/Library/StartupItems配下にNgircディレクトリを作成し,動作することを確認しました.ディレクトリ構成はこんな感じになります.

/Library/StartupItems/Ngirc
  |
  +-- 755 root/wheel Ngirc
  |
  +-- 644 root/wheel StartupParameters.plist

数字はアクセス権モード,rootはユーザID,wheelはグループID

で,肝心の二つのファイルはこんな感じになりました.

# Ngirc
##

. /etc/rc.common

StartService ()
{
	ConsoleMessage "Starting Ngirc"
	/usr/local/sbin/ngircd
}

StopService ()
{
	return 0;
}

RestartService ()
{
	return 0;
}

RunService "$1"
{
  Description     = "Ngircd IRC";
  Provides        = ("IRC Server");
  Uses            = ("Disks", "NFS");
}

これでmac miniをrebootすると,めでたくircdが動き始めました.めでたしめでたし.ちなみに,最初はStopService, RestartServiceのエントリも作っていたのですが,動きませんでした.pidファイルを/var/run配下に出力するようにしたのですが,権限のせいなのか起動時には作成できません.手動でngircdをroot権限で実行するともちろんファイルはできます.そういうわけで,この構成になっています.