BSDレイヤーシリーズ第3回は「スーパーサーバ」について。今回は、Tiger以降に採用された「launchd」を中心に、その働きと基本的な管理方法について解説してみよう。
OS Xのブート時間短縮にも貢献した「launchd」
一般的にUNIX系OSでは、システムのバックグラウンドに多数のサービス(デーモン)を稼働させ、さまざまな処理を行う。システムが起動手続きを開始したとき最初に「init」を起動し、それを親プロセスとして多数の初期化ファイル(rcスクリプト)を実行し必要なサービスを動作させる、という流れがUNIX伝統のスタイルだ。
OS Xも、前身であるNEXTSTEP/OPENSTEPの時代からそのスタイルを採用してきたが、OS X Tiger(10.4)のとき新方式へと移行した。それが現在のMavericksに至るまで採用されている「launchd」を使う方法だ。rcスクリプトの実質はシェルスクリプトであり、並列処理に適さないため複数のサービスを起動するには時間を要するが、launchdではその心配がない。OS Xのブートにかかる時間が短縮されたことには、launchdもひと役かっているのだ。
Tiger以降のOS Xは、ブートしたとき最初のプロセスとしてinitの代わりに「launchd」を起動し、rcスクリプトではなくプロパティリストファイル(*.plist)を参照して各種サービスを動作させる。/System/Library/LaunchDaemons(システム全体/全ユーザで起動される)と/System/Library/LaunchAgents(ユーザごとに起動される)などのディレクトリに多数あるプロパティリストファイルは、launchdによって起動されるサービスの定義ファイルなのだ。
launchdは、UNIX系OSで馴染み深い「cron」に代わり、定期的にプロセスを実行する目的にも使用できる。起動用のスクリプトはXMLで記述するため多少のノウハウは必要だが、実行のタイミングを細かく調整できるうえ、外部からのリクエストやイベントの発生を受けて実行するといった活用も可能となる。
launchdの管理ツール「launchctl」
launchdはサービスを統括するプログラム(スーパーサーバ)であり、Macのようにパーソナルなマシンでは存在を意識する必要がない。しかし、不要なサービスは起動しておかないに越したことはなく(システムリソースの浪費というよりはセキュリティ低下を招きかねないことのほうが重要)、要不要を細かくコンフィグレーションしたほうが安心な面もある。なにより、自分の知らない/関係がないプロセスが常に稼働しているのは気がかりだ。
そんなとき利用するコマンドが「launchctl」だ。内部コマンドを組み合わせ実行するスタイルで、主要なものにはサービスを読み込む「load」、実行中のサービスを停止する「unload」、launchdがOSブート時に認識したジョブを一覧する「list」が挙げられる。なお、root権限で実行されるサービスの読み込み/停止には管理者権限が必要だ(sudoコマンドの併用)。
このコマンドを利用すれば、デフォルトでは無効化されているサービスも起動できる。たとえば、FTPサーバを起動するには、以下のとおりコマンドを実行する。
FTPサーバを有効にする(次回ブート時から有効)
$ sudo launchctl load -w /System/Library/LaunchDaemons/ftp.plist
- 無効化するには「sudo launchctl unload -w /System/Library/LaunchDaemons/ftp.plist」
ところで、ASLファイルをご存知だろうか? 「コンソール」に表示されるシステムログファイルで、/private/var/log/aslディレクトリ以下に多数保存されている。不具合を探り当てるなどの場面で役立つが、健康な状態のシステムを使うユーザにとってはディスクを浪費するだけの存在だ。
筆者も、ディスク容量が厳しいMacBook Airについては、ASLファイルを生成するサービスを停止している。同じ理由でsyslogd(システムログを生成するサービス)も停止しているが、特に問題は起きていない。MacBook Airのリソースを有効活用したい向きは、試してみるといいだろう。
$ sudo launchctl stop com.apple.aslmanager
$ sudo launchctl stop com.apple.syslogd
- 再起動する場合は「sudo launchctl start com.apple.aslmanager」と「sudo launchctl start com.apple.syslogd」を実行する