web-dev-qa-db-ja.com

OSX-YosemiteとElCapitanで簡単なlaunchdデーモンを動作させる方法

私はOSXで起動するのは見知らぬ人ではありません。過去にいくつかのデーモンを作成しましたが、最後にMountain LionMavericksを使用しました。

しかし、私はマーベリックスとエルキャピタンで最も単純なplistを動作させるのに苦労しているようです。最初に、Tomcatを実行するplistをコピーし、起動時にWebSphere LibertyProfileを実行するように変更しました。いくつかのエラーを見た後、私はApple自身の[サイト] [1]から次のサンプル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>Label</key>
    <string>com.example.hello</string>

    <key>ProgramArguments</key>
    <array>
        <string>hello</string>
        <string>world</string>
    </array>

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

</dict>

Plistファイルを/ Library/LaunchDaemonsに配置してから、plistをロードすると、コンソールに次のエラーが表示されます。

10/5/15 11:52:44.868 AM com.Apple.xpc.launchd [1] :( com.example.hello)このサービスは常に実行されるように定義されており、本質的に非効率的です。

10/5/15 11:52:44.869 AM com.Apple.xpc.launchd [1] :( com.example.hello [66956])サービスを初期化できませんでした:15A284:xpcproxy + 12644 [1472] [19011403-4854- 3CCD-9FCF-49C36302EB40]:0x2

10/5/15 11:52:44.870 AM com.Apple.xpc.launchd [1] :( com.example.hello)サービスは0秒間しか実行されませんでした。リスポーンを10秒押し出します。

そして、それは出力に関する限りです。 StandardOutputログとStandardErrorログに書き込もうとしましたが、ログファイルが空です。

この状況はヨセミテとエルキャピタンの両方で発生しているので、許可を得たものでなければならないと思いました。

-rw-r--r--1ルートホイール418Oct 5 11:52 helloworld.plist

ただし、アクセス許可を644および755に設定してデーモンを実行しようとしましたが、それでも同じコンソールエラーが表示されます。

私は何かを見落としていますか?

3
Chris Harris

@Dooley_labsと@Spiffの助けを借りて実用的な例を作成することができました(ありがとう)。

次の例では、HelloWorldを指定されたログファイルに10秒ごとにエコーします。コンソールに出力が表示されませんが、ログファイルの内容を表示すると、HelloWorldが繰り返し書き込まれているのがわかります。

<?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>Label</key>
        <string>com.example.hello</string>

        <key>ProgramArguments</key>
        <array>
            <string>echo</string>
            <string>Hello World</string>
        </array>

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

        <key>StandardOutPath</key>
        <string>/var/log/helloworld.log</string>

    </dict>

</plist>
1
Chris Harris

ご覧のとおり、_<key>KeepAlive</key>_はcom.Apple.xpc.launchd[1]: (com.example.hello) This service is defined to be constantly running and is inherently inefficient.を出力しています。次に、その_<key>_から10秒以内にプロセスを再開するように指示します。

イベントのログがないため、com.Apple.xpc.launchd[1]: (com.example.hello[66956]) Service could not initialize: 15A284: xpcproxy + 12644 [1472][19011403-4854-3CCD-9FCF-49C36302EB40]: 0x2が何を言っているのか100%わかりませんが、他に何も実行されていないため、元の_<key>_からイベントに抗議しているようです。それと。 _<key>_を削除するか、別のものに変更してみてください。おそらく:

_<key>Label</key>
<string>com.example.hello</string>

<key>ProgramArguments</key>
<array>
    <string>hello</string>
    <string>world</string>
</array>

<key>KeepAlive</key>
<false/>
_

または

_<key>Label</key>
<string>com.example.hello</string>

<key>ProgramArguments</key>
<array>
    <string>hello</string>
    <string>world</string>
</array>
_

繰り返しになりますが、100%確信はありませんが、そのようなことを試してみることをお勧めします。 OSは、keepAliveノードが不要であると抗議しているので、幸運を祈ります。

1
Dooley_labs

これを読むときは平手打ちするつもりですが、launchctlに実行する実行可能ファイルを指示していません!

最初の答えは、最初の「ProgramArguments」として「echo」を正しく持っていますが、それが問題であるとまでは言いませんでした。

「Program」キーを使用してそれを行うこともできたと思いますが、実行可能ファイルに渡されるarg []配列である「ProgramArguments」キーでそれを繰り返す必要がないかどうかはわかりません。

注意すべきもう1つのことは、実行可能ファイルへのフルパスを常にリストすることです。 launchd/launchctlはかなりタイトですが、それでも、BadGuy™は悪意のある「echo」実行可能ファイルをデフォルトの$ PATHのどこかに置き、launchctlがLaunchDaemonplistを再解析するのを待つ可能性があります。

0
Jan Steinman