私は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に設定してデーモンを実行しようとしましたが、それでも同じコンソールエラーが表示されます。
私は何かを見落としていますか?
@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>
ご覧のとおり、_<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ノードが不要であると抗議しているので、幸運を祈ります。
これを読むときは平手打ちするつもりですが、launchctlに実行する実行可能ファイルを指示していません!
最初の答えは、最初の「ProgramArguments」として「echo」を正しく持っていますが、それが問題であるとまでは言いませんでした。
「Program」キーを使用してそれを行うこともできたと思いますが、実行可能ファイルに渡されるarg []配列である「ProgramArguments」キーでそれを繰り返す必要がないかどうかはわかりません。
注意すべきもう1つのことは、実行可能ファイルへのフルパスを常にリストすることです。 launchd/launchctlはかなりタイトですが、それでも、BadGuy™は悪意のある「echo」実行可能ファイルをデフォルトの$ PATHのどこかに置き、launchctlがLaunchDaemonplistを再解析するのを待つ可能性があります。