【问题标题】:Trying to understand launchd daemon state试图了解launchd守护进程状态
【发布时间】:2018-04-25 14:37:28
【问题描述】:

我正在尝试在 macOS 10.13 High Sierra 上为 Zabbix 代理设置启动守护程序。

首先我安装 Zabbix 代理:

brew install zabbix --without-server-proxy

然后我用这个内容创建一个名为 com.zabbix.zabbix_agentd.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>AbandonProcessGroup</key>
        <true/>
        <key>GroupName</key>
        <string>zabbix</string>
        <key>KeepAlive</key>
        <dict>
                <key>SuccessfulExit</key>
                <false/>
        </dict>
        <key>Label</key>
        <string>com.zabbix.zabbix_agentd</string>
        <key>ProgramArguments</key>
        <array>
                <string>/usr/local/sbin/zabbix_agentd</string>
                <string>-c</string>
                <string>/opt/zabbix/zabbix_agentd.conf</string>
        </array>
        <key>RunAtLoad</key>
        <true/>
        <key>StandardErrorPath</key>
        <string>/var/log/zabbix/zabbix_agentd.error.log</string>
        <key>StandardOutPath</key>
        <string>/var/log/zabbix/zabbix_agentd.stdout.log</string>
        <key>UserName</key>
        <string>zabbix</string>
</dict>
</plist>

我加载它:

sudo launchctl load ./com.zabbix.zabbix_agentd.plist

现在我可以看到守护进程已经完成了我所期望的:

ps ax | grep zabbix_agentd | grep -v grep

我看到了 6 个 zabbix 进程。 1 个收集器、3 个侦听器、1 个主动检查以及启动守护进程启动的进程:

8931   ??  S      0:00.01 /usr/local/sbin/zabbix_agentd -c /opt/zabbix_agentd.conf

但是当我运行这个命令时:

launchctl print system/com.zabbix.zabbix_agentd | grep state

我得到这个输出:

state = waiting

我希望看到 state = running... 为什么该命令告诉我守护进程正在等待,而它有 6 个正在运行的进程?

这是“按设计工作”还是我做错了什么?

【问题讨论】:

    标签: macos plist zabbix launchd macos-high-sierra


    【解决方案1】:

    这有点像“按设计工作”,但我真的想说这是 zabbix 和 launchd 之间关于守护进程应该如何工作的哲学冲突的结果。

    当你运行 zabbix_agentd 时,它会“守护”自己,这意味着它会将实际的守护进程作为后台子进程触发,然后父进程退出;从那时起,守护进程(以及它启动的任何子进程)几乎独立于启动它们的任何东西运行。这几乎是 unix 守护进程的传统操作方式。

    另一方面,launchd 被编写为期望它管理的守护进程留在前台并直接在其下执行;与远离 launchd 的情况相比,这使 launchd 具有更多监控和控制其守护进程的能力。

    这是传统unix守护进程和launchd之间的常见冲突,有两种解决方法:要么让守护进程在前台运行(即符合launchd的做事方式),要么告诉launchd不要担心守护进程似乎已经退出。 zabbix_agentd 似乎没有像--nodaemon 选项(根据these docs),所以你必须适应launchd(更新:较新的版本,见下文)。执行此操作的标准方法(这几乎就是您在 .plist 中所拥有的)是添加 AbandonProcessGroupKeepAlive 键来告诉 launchd 在(据它所知)守护程序退出时不要惊慌。这可行,但这意味着 launchd 无法判断守护程序的实际情况,从而导致您看到看起来很奇怪的结果。

    更新:我正在查看旧版本的 zabbix_agentd。 Stefan 发现-f(或--foreground)选项被添加到version 3.0 中的zabbix_agentd。有了这个,我建议将--foreground 添加到ProgramArguments 数组,用简单的&lt;true/&gt; 替换KeepAlive 字典(这告诉launchd 自动重启守护进程,如果它出于任何原因退出),并删除&lt;key&gt;AbandonProcessGroup&lt;/key&gt;&lt;true/&gt;(此选项控制如果主守护进程退出/崩溃,launchd 是否清理剩余的子进程)。结果应如下所示:

    <?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>GroupName</key>
            <string>zabbix</string>
            <key>Label</key>
            <string>com.zabbix.zabbix_agentd</string>
            <key>ProgramArguments</key>
            <array>
                    <string>/usr/local/sbin/zabbix_agentd</string>
                    <string>-c</string>
                    <string>/opt/zabbix/zabbix_agentd.conf</string>
                    <string>--foreground</string>
            </array>
            <key>RunAtLoad</key>
            <true/>
            <key>KeepAlive</key>
            <true/>
            <key>StandardErrorPath</key>
            <string>/var/log/zabbix/zabbix_agentd.error.log</string>
            <key>StandardOutPath</key>
            <string>/var/log/zabbix/zabbix_agentd.stdout.log</string>
            <key>UserName</key>
            <string>zabbix</string>
    </dict>
    </plist>
    

    【讨论】:

    • 谢谢,您的回答为我指明了找到 --foreground 选项的正确方向。
    • 酷!我将更新我的答案,为该选项提供更完整的建议。
    • 感谢更新的答案。我可以确认它可以与 --foreground 选项一起使用。我的 launchd 守护程序的状态现在正在运行
    猜你喜欢
    • 2013-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-17
    • 1970-01-01
    • 2017-02-18
    • 1970-01-01
    相关资源
    最近更新 更多