【问题标题】:Launchd plist service is not shutting down启动的 plist 服务未关闭
【发布时间】:2012-03-13 12:51:52
【问题描述】:

我有想要在 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 时,它并没有下降。它保留在内存中并像什么都没发生一样运行。不知道可能是什么原因。请帮忙!

【问题讨论】:

    标签: macos service plist shutdown launchd


    【解决方案1】:

    您的应用程序是否自行守护进程(即进入后台)?如果是这样,它本质上就是将自己与 launchd 分离,从而阻止 launchd 对其进行管理。

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

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

    【讨论】:

    • MyService' 在 plist 被重命名为 jsvc 可执行文件。我的应用程序是用 Java 编写的,所以我不得不使用它。 jsvc命令行开关中有一个选项'-nodetach',如果我不使用它,我什至无法启动服务。
    • 现在我正在执行另一项任务,但稍后会返回。感谢您的回复。
    【解决方案2】:

    对我有用的文件如下。我知道我的守护进程不能脱离控制进程,它必须是“按需”,所以我可以在我想要的时候停止它。我在处理它时做了一些萨满舞,虽然我不清楚它是从什么时候开始起作用的。现在可以了。

    <?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>
    

    【讨论】:

      猜你喜欢
      • 2019-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-26
      • 1970-01-01
      • 2016-06-15
      • 2013-02-03
      相关资源
      最近更新 更多