启动的plist服务没有关闭

时间:2012-03-13 12:51:52

标签: macos service plist shutdown launchd

我有应用程序我想在OSX上作为LaunchDaemon运行。我的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时它不会下降。它保留在内存中并且好像什么都没发生一样。不知道可能是什么原因。请帮助!

2 个答案:

答案 0 :(得分:1)

你的应用程序是否自己守护(即落入后台)?如果是这样的话,它基本上会与launchd分离,因此阻止了launchd的管理。

编辑:如果应用程序没有自己进行守护,接下来要看的是查看launchd认为正在进行launchctl list my.service的事情。这应该转储守护进程的属性列表,包括其PID(如果launchd认为它正在运行)和LastExitStatus(它是否在上次运行时成功退出)。 PID是否与实际运行过程相对应?当您尝试停止服务时结果是否会更改(特别是PID更改为0)?进程列表(例如,使用ps -axj)是否显示父进程退出后生活的所有子进程?

哦,只是为了确保:在管理LaunchDaemons时,您需要使用sudo launchctl(没有sudo,launchctl将尝试在您的用户会话中管理LaunchAgent)。

答案 1 :(得分: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>