おもしろwebサービス開発日記

Ruby や Rails を中心に、web技術について書いています

Macのlaunchdについて

Macでatコマンドを使ったらなぜかうまくいかなくて、原因を調べたら、どうやらdaemonが起動していない模様。

atコマンドが使いたくなった。launchctl - fu7mu4の日記

設定は上記の記事の通りやったら動いたのですが、そもそもMac特有のlaunchdについてよく知らないことに気づいたのでざっくり調べてみました。

launchdの基礎

  • 他のUNIXで使われているinitの代わり
  • init, inetd, cron等の設定を共通化するために作られた*1
  • サービスごとに個別の設定ファイル(launchd.plist)に記述される。
  • initの代わりとして、PID1で動くlaunchdの他に、必要に応じて、ログインしているユーザごとにそれぞれユーザ向けlaunchdが動作する。

launchdの起動するサービス

DaemonとAgentがある。

  • Daemon
    • root権限での動作が前提。ユーザの有無とは無関係のサービス
  • Agent
    • 各ユーザ向けのサービス。ユーザ権限で起動されるlaunchdから立ち上がる

launchd.plist

  • サービスのラベル名.plist
  • xmlで表現
  • プロパティリストと呼ばれる書式を持つ
  • キーと値の「ディクショナリ」と呼ばれる連想配列で設定。

launchd.plistの設定項目

自分が使いそうなやつだけメモ。

Label
ラベルを指定。必須
Diaabled
yesなら設定無効
UserName
実行ユーザを指定
ProgramArguments
配列で指定。起動するサービスのパスと引数を指定。
Program
プログラム名を指定。
OnDemand
yesならイベント発生時に起動するようになる
RunAtLoad
yesならlaunchd起動時に起動するようになる

デーモン設定の仕方

デーモンが起動してないんじゃないかなーと思ったときにとる行動のメモ。

  1. /System/Library/LaunchDaemonに移動
  2. それらしき設定ファイルを探す
  3. Disableがtrueになってたらlaunchctl load -w ファイル名 などする
  4. 設定がそれでよさそうならlaunchctl start ラベル名

*1:Macだけ使う人にとっては便利になったのかもしれないけどUNIX使いにとっては迷惑な話><