2012-03-13 4 views
1

OSXでLaunchDaemonとして実行したいアプリケーションがあります。私のplistは次のようになります:Launchd 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>my.service</string> 
    <key>ProgramArguments</key> 
    <array> 
     <string>/servertest/MyService</string> 
     <string>-jvm</string> 
     <string>server</string> 
     <string>-nodetach</string>  
     <string>-outfile</string> 
     <string>out.txt</string> 
     <string>-errfile</string> 
     <string>err.txt</string> 
     <string>-verbose</string> 
     <string>-debug</string> 
     <string>-home</string> 
     <string>/System/Library/Frameworks/JavaVM.framework/Home</string> 
     <string>-cp</string> 
     <string>./lib/hsqldb.jar:./lib/myservice-wrapper.jar:./lib/commons-daemon-1.0.8.jar</string> 
     <string>my.service.DaemonMac</string> 
    </array> 
    <key>RunAtLoad</key> 
    <true/> 
    <key>StandardErrorPath</key> 
    <string>/servertest/stderr.log</string> 
    <key>StandardOutPath</key> 
    <string>/servertest/stdout.log</string> 
    <key>WorkingDirectory</key> 
    <string>/servertest</string> 
</dict> 
</plist> 

サービスは「launchctl start my.service」と呼ばれます。 しかし、私は 'launchctl stop my.service'を使うと落ちないし、plistをアンロードすることもあります。まるで何も起こらないかのように、それは記憶に残っており、走っている理由が何であるか分かりません。助けてください!

答えて

1

私のために働いたファイルは以下の通りです。私は自分のデーモンが自分自身をプロセスを制御することから分離してはならないことを学びました。そして、それは "OnDemand"でなければなりません。私はそれに取り組んでいる間にいくつかのシャーマンの踊りを作ったし、それが動作するようになった時点で私には明らかではないが。今それはあります。

<?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>myserver</string> 
    <key>OnDemand</key> 
    <true/> 
    <key>ProgramArguments</key> 
    <array> 
     <string>/opt/MYServer/MYServer</string> 
     <string>-server</string> 
     <string>-outfile</string> 
     <string>/opt/MYServer/out.txt</string> 
     <string>-errfile</string> 
     <string>/opt/MYServer/err.txt</string> 
     <string>-verbose</string> 
     <string>-debug</string> 
     <string>-nodetach</string> 
     <string>-home</string> 
     <string>/System/Library/Frameworks/JavaVM.framework/Home</string> 
     <string>-cp</string> 
     <string>/opt/MYServer/lib/hsqldb.jar:/opt/MYServer/lib/my-wrapper.jar:/opt/MYServer/lib/commons-daemon-1.0.8.jar</string> 
     <string>my.service.DaemonMac</string> 
    </array> 
    <key>RunAtLoad</key> 
    <true/> 
    <key>StandardErrorPath</key> 
    <string>/opt/MYServer/stderr.log</string> 
    <key>StandardOutPath</key> 
    <string>/opt/MYServer/stdout.log</string> 
    <key>WorkingDirectory</key> 
    <string>/opt/MYServer</string> 
</dict> 
</plist> 
1

アプリケーションが自分自身をデーモン化(つまり、バックグラウンドにドロップ)していますか?もしそうなら、それは本質的にlaunchdからそれ自身を切り離し、それゆえlaunchdがそれを管理することを妨げます。

EDIT:アプリケーションがそれ自体をデーモン化していない場合、次に見なければならないのは、launch37がlaunchctl list my.serviceで起こっていると考えるものです。これにより、デーモンのPID(起動していると思っていると思う場合)とLastExitStatus(最後に起動したときに正常に終了したかどうかなど)のリストがダンプされます。 PIDは実際の実行プロセスに対応していますか?サービスを停止しようとすると結果が変わります(特にPIDの変更は0になりますか)。プロセスリスト(例:ps -axj)には、親出口の後に生きている子プロセスが表示されますか?

ああ、LaunchDaemonsを管理するときは、sudo launchctlを使用する必要があります(sudoなしでは、launchctlはユーザーセッション内でLaunchAgentを管理しようとします)。

+0

MyService 'in plistはjsvc executableと改名されました。 私のアプリケーションはJavaになっていますので、私はそれを使用しなければなりませんでした。 jsvcのコマンドラインスイッチの中に '-nodetach'オプションがあります。私がそれを使用しないと、サービスを開始することさえできません。 –

+0

今私は別の仕事をしていますが、後でこれに戻ります。レスポンスありがとう。 –

関連する問題