2012-03-13 78 views
1

我有应用程序,我想在OSX上运行LaunchDaemon。我的plist看起来像这样:启动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

对我有效的文件如下。我了解到,我的deamon一定不能脱离控制过程,它必须是“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管理它。

编辑:如果应用程序不是守护进程本身,接下来要看看launchd认为正在发生什么launchctl list my.service。这应该转储守护程序的属性列表,包括它的PID(如果launchd认为它正在运行)和LastExitStatus(它是否在上次运行时成功退出)。 PID是否对应于实际运行过程?试图停止服务时结果是否发生变化(尤其是PID是否更改为0)?进程列表(例如ps -axj)是否显示在父进程退出后生活的任何子进程?

哦,只是为了确保:管理LaunchDaemons时,你需要使用sudo launchctl(不须藤,launchctl会尝试将用户会话中管理LaunchAgents)。

+0

plist中的MyService'被重命名为jsvc可执行文件。 我的应用程序是在Java中,所以我不得不使用它。在jsvc命令行开关中有一个选项'-nodetach',如果我不使用它,我甚至不能启动服务。 – 2012-03-13 16:18:46

+0

现在我正在处理另一项任务,但稍后会返回。感谢您的回应。 – 2012-03-22 10:08:41

相关问题