9 件のコメントがあります。

スパムブロック機能により、投稿が失敗することがあります。
うまくいかない場合は、一行目だけをまず投稿し、そのあと編集から残りを追記してみてください。

1 - 9 / 9

Leopard の launchd について

From : マックを勉強中の人 @ 2008-01-17 12:07:44 編集 引用

こんにちは。はじめて投稿させていただきました。
Leopard の launchd について分からない事がありまして、この場を利用しております。これより以降、Leopard(10.5.1)ベースでの話となります。

xinetd 経由で起動する hotwayd (HTTPMail を、既存の MUA を使って読み書きを可能にするためのローカルpop3サーバー)というデーモンがあります。

この hotwayd を launchd の下で起動できるように、以下の plist を作成しました。(内容については、関連サイトの情報に基づいています。)

---- ここから usr.hotway.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>InitGroups</key>
<true/>
<key>Label</key>
<string>usr.hotway</string>
<key>ProgramArguments</key>
<array>
<string>/usr/local/sbin/hotwayd</string>
</array>
<key>inetdCompatibility</key>
<dict>
<key>Wait</key>
<false/>
</dict>
<key>Sockets</key>
<dict>
<key>Listeners</key>
<dict>
<key>Bonjour</key>
<true/>
<key>SockServiceName</key>
<string>6110</string>
</dict>
</dict>
<key>UserName</key>
<string>root</string>
<key>OnDemand</key>
<true/>
</dict>
</plist>

---- ここまで usr.hotway.plist ----------------------

次に、上記の usr.hotway.plist を /Library/LaunchDaemons に配置させて、

$ sudo launchctl load -w /Library/LaunchDaemons/usr.hotway.plist

を実行し、hotwayd が正常に動作していることを fetchmail を用いて確認しました。
ところが、以後、OS を再起動すると、plist が自動ロードされているものの fetchmail でアクセスしても hotwayd が起動されずにアクセスはタイムアウトとなります。(再起動直後に、plist がロードされていることは、"sudo launchctl list" で確認しています。)

そこで、

$ sudo launchctl unload -w /Library/LaunchDaemons/usr.hotway.plist
$ sudo launchctl load -w /Library/LaunchDaemons/usr.hotway.plist

を実行(一度 unload して、再び load する。)すると、fetchmail のアクセストリガーで hotwayd を起動させることができるようになります。

これらを踏まえて、お聞きしたいことが以下に2点ほどあります。

(1)OS を再起動しても、hotwayd をイベントベースで自動起動させるために、何か不足していることはあるでしょうか?

(2)同じことを、Tiger(10.4.x) で実行すると、何ら問題なく自動起動させることができております。OnDemand の自動起動 について、Leopard に特有の事情などあるのでしょうか?

どなたか、ご教示ください。

以上

Re: Leopard の launchd について

From : namahage @ 2008-01-17 21:11:32 編集 引用

マックを勉強中の人 さん、どうもこんにちは。

書き込まれておられましたplistには私の見たことのないキーがあるようでした。
launchdは私はよくわかっていないものですからあまり当てにはならないレスしかできないのですが、少しわかる範囲で考えてみました。

launchdについては、いまのところ一番わかりやすく、役に立つのはマイコミジャーナルさんに掲載されている

the inner universe of Leopard - 「rcの引退とlaunchdの強化」

だったなぁと思っています。
具体的なページだけリンクしますと、

Tigerまでに利用できるlaunchdの設定項目(キーワード)一覧
http://journal.mycom.co.jp/articles/2007/12/11/iul01/006.html

Leopardで追加された、launchdの新しい設定項目(キーワード)一覧
http://journal.mycom.co.jp/articles/2007/12/11/iul01/005.html

です。

(1)OS を再起動しても、hotwayd をイベントベースで自動起動させるために、何か不足していることはあるでしょうか?

気になったのは
上記ページには見あたらない「Listeners」というディクショナリと、Leopardでは「OnDemand」が「KeepAlive」に置き換えられているというところぐらいでしょうか。その辺をふまえて考えますと、とりあえずためしてみたいところでは、上記のplistにあるOnDemandキーのところ

<key>OnDemand</key>
<true/>

これから

<key>KeepAlive</key>
<true/>

への変更あたりでしょうか。OnDemandのほうは、置き換えが行われているだけで、互換があり、このままでも動作するのではないかと予想していますが、今まで気がつかずにいたものでして、試したことがないのでよくわかりません。Listenersについては後で調べてみたいと思っています。

(2)同じことを、Tiger(10.4.x) で実行すると、何ら問題なく自動起動させることができております。OnDemand の自動起動 について、Leopard に特有の事情などあるのでしょうか?

この挙動からかんがえますと、やはりOnDemandがKeepAliveに置き換えられたことによるのかもしれないですね。一度コンソールでシステムログを読んでみるという手もあると思います。launchdは意外と話し好きのようでして、いろいろとログが残っていることがあります。

Re: Leopard の launchd について

From : マックを勉強中の人 @ 2008-01-21 00:10:41 編集 引用

こんばんは。

返信ありがとうございます。
実は、紹介いただきましたマイコミジャーナルの掲載内容については既に拝見しておりまして、OnDemand を KeepAlive に置き換えての試行も実施していました。結果は変わらずでした。この件も合わせて記載すべきでした。すみません。

システムログの方ですが、launch をキーにして、あやしそうな箇所を見いだそうとしたのですが、何をどう見ればいいのか。。。ただし、気になることがありました。

<hfs のマウントで一度失敗している。>
  ディスクをいくつかにバーティション分割して、起動ボリュームに他のボリュームをマウントさせ、さら  にそのマウント先のボリュームには別のボリュームをマウントさせているのですが、後者のマウント時に  一度失敗している模様でした。ただし、起動後には正常にアクセスできていますし、df でもマウントを  確認しています。(どのタイミングで再度、マウントを試みているのやら不明ですが。。。)

     起動ボリュームの a フォルダ ← A ボリューム
     A ボリュームの b フォルダ  ← B ボリューム(※このときに、失敗している模様)

  気になるのは、hotwayd をBボリュームに配置していたということです。ということで、hotwayd を起動
  ボリュームに移し替えて試してみましたが、やはり、状況に変化はありませんでした。  

  因に、起動直後に nmap でサービスボートがリスニングされていることを確認しましたので
  launchproxyまでは 正常に起動していると判断しています。

  ということで、増々、わからなくなってきました????

Re: Leopard の launchd について

From : namahage @ 2008-01-21 22:27:29 編集 引用

どうもこんにちは。
はは、これはむずかしいですね。
私のところでも環境をそろえていじってみたいなと思うところです。
plistを見直してみても問題があるようには思えないですし。

マウント周りで、ロードに失敗しているのだとするとKeepAliveにPathStateのディクショナリあたりを追加すれば、うまくいけるのかな、なんて思ったりしたのですが、ボリュームの切り替えを試されても、解決しなかったところをみると、違うみたいですね。

うーん、そうですねぇ。
既に試しておられるかもしれないのですが、

<key>OnDemand</key>
<true/>

となっていますので、そのまま常駐するように

<key>OnDemand</key>
<false/>

と設定してみるという方法ですか。これで動作を確認してみるところでしょうか?
根本的な問題の解決にはなりませんが、すこしは問題の切り分けになるような気がします。

あと、起動時に転んでいるあたりを考えるとログイン、システム起動時などにとりあえず一度起動する

<key>RunAtLoad</key>
<true/>

キーの追加を試してみる、あたりでしょうか。

方向性が微妙なものだと、やっていることは全く同じなわけですが、Lingonを利用してみるという方法です。
設定項目が少ないのであまり今回は役に立ちそうもありませんが、何か効果がみられるかもしれません。

一度もっと、ぐっと単純な内容に減らしてすこしづつ追加していくというのもためしてみたいところですね。

Re: Leopard の launchd について

From : マックを勉強中の人 @ 2008-01-29 00:40:24 編集 引用

いろいろと考えられるパターンを試してみましたが、どれも上手く
いきませんでした。悩ましいです。

そこで、もの凄くシンプルなものでテストしてみることにしました。
用意したものは、

  ●エコーバックするだけの、簡単なシェルスクリプト sample.sh
  ●そのスクリプトをinetdCompatibility で呼び出すための usr.sample.plist

です。それぞれの内容は以下の通りです。

---<sample.sh>---------
#!/bin/sh

read data
echo $data
----------------------

---<usr.sample.plist>----
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/
PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>KeepAlive</key>
<false/>
<key>Label</key>
<string>usr.sample</string>
<key>ProgramArguments</key>
<array>
<string>/usr/local/sbin/sample.sh</string>
</array>
<key>inetdCompatibility</key>
<dict>
<key>Wait</key>
<false/>
</dict>
<key>Sockets</key>
<dict>
<key>Listener</key>
<dict>
<key>SockProtocol</key>
<string>TCP</string>
<key>SockServiceName</key>
<string>10111</string>
<key>SockType</key>
<string>stream</string>
</dict>
</dict>
</dict>
</plist>
----------------------

そして、
plist を /Library/LaunchDaemons に配置し、Leopard(10.5.1 client) を再起動して、

(1)sudo netstat -a で 10111 ポートがリスニングされていることを確認する。
(2)telnet localhost 10111 を実行する。
(3)Trying ::1... となったまま固まっていることを確認する。
(4)タイムアウトを待たずに、途中で、control-c する。
(5)sudo launchctl unload usr.sample.plist / sudo launchctl load usr.sample.plist を実行する。
(6)再び、telnet localhost 10111 を実行する。
(7)以下のように、接続が可能となり、エコーバックされることを確認する。
    Trying ::1...
    Connected to localhost.
    Escape character is '^]'.
    aaaa ← 入力
    aaaa ← エコーバック
    Connection closed by foreign host.

ということで、こんなにシンプルなものでも同様の結果となってしまいました。

どなたか、この2つのファイルを用いて、同様の結果となるか確認していただけ
ないでしょうか。

追伸;
英語圏のサイトを見ていたら、Leopard のファイアウォールとの併用で UW-IMAP が lanuchd 経由で上手く動かないとかなんとか記述されているようでしたので、この辺りもテストの際のファクターとして試してみましたが、
やはり結果に変わりはありませんでした。

Re: Leopard の launchd について

From : namahage @ 2008-01-29 20:04:31 編集 引用

どうもこんにちは。

なかなか悩ましい状態になってきましたね。
同様のスクリプトについては私も後で試してみたいと思います。
風邪でノックアウト気味でして...。

私も考えてみていたのですが、ファイアウォール周りがなにかサービスのブロックをしているのではと思っていました。MySQLが一度ポート解放を求めてきたことがあったように思います。既に試されているのかもしれませんが、システム環境設定のセキュリティパネルで設定をしてみるというのはどうでしょうか?何にしてもリストの再読み込みでポートが開くというような仕組みというのもなんだか微妙な気もしますのでこれは外していそうな気がします。

あとは、消極的かつ妥協策になりますが、
起動後、plistの再読み込みを行うとうまくアクセスできるというところから、とりそぎAppleScriptでこれを自動化してしまうという方法はどうでしょうか。

===AppleScriptここから===

--起動後の処理待ち時間
delay 15

--launchctlの再読み込み
do shell script "sudo launchctl unload usr.sample.plist" password "" with administrator privileges
do shell script "sudo launchctl load usr.sample.plist" password "" with administrator privileges

===AppleScriptここまで===

スクリプトエディタで上記のスクリプトを作成し、「アプリケーション、初期画面なし」で任意の場所に保存をします。delayはコマンドが実行されるまでの待ち時間みたいに使っていますので、不要なら外すか、時間を増やすかして見てください。あとはこれをシステム環境設定のアカウントパネルを開き、ログイン項目に追加すれば、とりあえずはごまかしができそうな気もしています。

なんといいますか、じつにすっきりしない解決策ですがとりいそぎならこれでどうでしょう。

Re: Leopard の launchd について

From : namahage @ 2008-01-29 22:01:32 編集 引用

すみません。
上記のスクリプトのままだと、スクリプトアプリケーション起動時にパスワードを求められます。
スクリプト内のpassword""の""内に管理者パスワードを入力しておく必要があります。

ただし、ここに入力をすると管理者パスワードが場合によってはだれかに盗み見されてしまう可能性があるので、それなりに安全なアクセス権を施しておくか、悪意あるユーザーに覗かれない場所に設置しておく必要があります。

Re: Leopard の launchd について

From : マックを勉強中の人 @ 2008-01-31 23:40:36 編集 引用

こんばんは。

スクリプトの提供、ありがとうございました。
現在のところ、待ち時間処理を入れることしか回避策はないようですね。

しかし、私はAppleScriptの未経験者でして、色々と考えた挙げ句に、やはり、この待ち時間処理もlaunchdによって実現することにしました。そして、結果的に実現することはできましたが、これまでの経緯も含めて実現までの試行錯誤を通して判明した事実が2つありますので、以下にまとめておきます。

(1)launchdによる様々な起動プロセスは実行完了順序が保証されない。(まあ、当たり前ですかね。)
今回のように、マウントしているボリュームにデーモンプログラムを配置している場合は、以下の条件が整わない限り、launchdによる起動は成功しない。

   ●plist のロードによってデーモンプログラムが登録される前に、配置元のボリュームはマウ
    ントされていなければならない。
   ●ただし、WatchPath 、QueueDirectories、StartOnMount などのイベント監視を指定して
    いるものについては、イベント監視の周期に応じてデーモンプログラムの存在を再確認し
    ているようで、この類いの起動プロセスはボリュームのマウントが前後してもいずれは成
    功する。

(2)ソケットによるイベント指定はおそらく不具合がある。
今回を機に試行できる限りのイベント指定を試してみました。結論としては、少なくともソケットによるイベント指定は待ち時間を挿入しない限り上手くいかないことが判明しています。原因は不明ですが、ファイアウォールとの関係があるような気がしてなりません。

<総括>
ということで、今回のケースでの待ち時間処理の目的は、

   ●ボリュームのマウント待ち
   ●ソケットによるイベント指定の不具合対策

ということになります。

Re: Leopard の launchd について

From : namahage @ 2008-05-30 08:13:12 編集 引用

だいぶ古い書き込みになってしまいます。
上記の話とは別物かもしれませんが、私が忘れてしまわないための備忘録的に書き込んでおきます。

最近launchdを少しいじる機会があり、泥沼を犬かきで泳ぐような作業をしていました。
そんな作業の中で気がついたことがあります。

動かしたいサービスについて、launchdのplistを作成し、リストにloadさせ、起動する作業まですませても、launchd経由でそのサービスを起動させるのに失敗するときがありました。一瞬起動しているのが確認できたり、そのサービスに一度は接続できるときがあるのに、もう一度やろうとするとサービスが停止していたりする、そんな症状です。

はて?なんでだろうなと悩んだのですが、原因は私がSockServiceNameの指定の仕方をよくわかっていないからでした。

<key>SockServiceName</key>
<string>サービス名</string>

plistのなかで、SockServiceNameの後に続くstringにはサービス名を入れなければいけませんが、このサービス名には、

connect(2)ないしはbind(2)で用いられるサービス名(TCP/IPの場合/etc/servicesで示されるサービス名など)を指定

の必要があるようです。つまり

/etc/services

に書き込まれているサービス名と一致していないといけないということでした。
pop3を起動させるplistならこのサービス名のところにpop3と入れないといけないようです。ポート番号でもいけるかどうかはまだ試していません。

私はimapの起動設定をやっていてはまりました。

<key>SockServiceName</key>
<string>imap</string>

と入力すればいいのに、慌てていて

<key>SockServiceName</key>
<string>imapd</string>

となっていました。
これだとだめでした。これに気づかずだいぶはまりました。

ということで、SockServiceNameを入力するときは一度/etc/servicesをCotEditorなどで開いて、サービス名を確認して指定するという作業を心がけようと思いました。あとなければ/etc/servicesにサービス名を追加する必要があるということでしょうか。

Post Your Comment


*は入力必須です。E-Mailは公開されません。