2008年12月2日火曜日

Mac OS Xでの定期的な処理 - launchdについて

Macでlaunchdを使うという話。

経緯:
  1. バックアップサーバ (Fedora Core 1 + Pentium-II 333MHzの骨董品。) のディスクが残り少なくなって来た。
  2. 社内を見回す。→I-O DATAのLANDISK (HDL-GT) が目につく。いつもはMac/Windowsクライアントにとってのお手軽NAS.
  3. LANDISKをバックアップサーバにマウントしようとするも、様々な要因で断念。
  4. 再度社内を見回す。→あまり使わなくなったPowerMac G5 (Leopard) が目につく。
  5. mount_afpでLANDISKをマウントする。
  6. バックアップサーバで動いていたバックアップスクリプトをPowerMacに持ってくる。
  7. そのスクリプト達をcronジョブとして登録しようとすると…あれ??!

Mac OS Xにはcrond無いんですね。その様な用途にはlaunchdを使えとあります。

Getting Started with launchd

launchdにいろいろ仕事をさせるための設定ファイルはXML形式となっています。手で書くのもしんどいなと思って探していたら、こんな素敵なアプリを見つけました。

Lingon

これを使ってFedora Core 1で動かしていたバックアップスクリプト用のlaunchd.plistを作成しても、スクリプトの末尾にある以下の様なよくあるメール送信コマンドがうまく動きません。

$ echo <メール本文> | mail -s <メールSubject> <宛先アドレス>

system.logには以下の様なエントリが残っています。

08/12/02 15:48:55 com.apple.launchd[110] (<launchdラベル>[<プロセスID>]) Stray process with PGID equal to this dead job: PID 316 PPID 1 sendmail <ホスト名>:

バックアップスクリプトが終了した途端、mailコマンドから起動されるsendmailがkillされている様に見える。

以下の様な事が起きているのかなと推測。
  1. launchdがバックアップスクリプトを呼び出す。
  2. バックアップスクリプト中のmailコマンドが呼ばれる。
  3. mailコマンドは非同期に終了、バックアップスクリプトのプロセスに戻ってくる。
  4. バックアップスクリプトが終了、launchdのガーベージコレクタが、先に非同期に起動された、同じプロセスグループIDを持つsendmailも片付けちゃう。
  5. 結果、メールが送信されない。

さらに色々調べるとこんなページを発見。AppleのDarwin関連ドキュメントって実はしっかりしてたんだなあと感心。

Technical Note TN2083: Daemons and Agents

ここを読むと、概ね上の推測は外れてない事がわかる。書かれている通りplistに


<key>AbandonProcessGroup</key>

<true/>



を追加すると、mailは送信されるようになった!

が、system.logに上のStray process云々のエントリはまだ残ってる。なんじゃこりゃ。

一応動いてるからいいって事にしといていいのか?

…しばらく様子を見よう。

0 件のコメント: