【问题标题】:OS X Launchd over SocketOS X 通过 Socket 启动
【发布时间】:2013-07-03 20:55:21
【问题描述】:

我正在尝试找出一种在 OS X 服务器上触发启动守护程序的方法。我发现我可以设置 launchd 守护程序来监听特定的套接字连接(tcp 端口),当被联系时,它将执行一个脚本。我已经成功地完成了所有这些,除了当我打开一个到套接字的连接(用于使用 telnet 进行测试)时,即使我断开了套接字连接,脚本也会无限期地执行。

已启动 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>Label</key>
    <string>com.example.app</string>
    <key>Program</key>
    <string>/usr/bin/true</string>
    <key>Sockets</key>
    <dict>
        <key>Listeners</key>
        <dict>
            <key>SockServiceName</key>
            <string>1234</string>
        </dict>
    </dict>
    <key>inetdCompatibility</key>
    <dict>
        <key>Wait</key>
        <true/>
    </dict>
</dict>
</plist>

有谁知道为什么脚本会一次又一次地被调用?我的目标是在从客户端建立套接字连接时只执行一次脚本...

文斯,感谢您的帮助

【问题讨论】:

    标签: macos sockets daemon launchd


    【解决方案1】:

    通过在inetdCompatibility 字典中指定Wait = true,您就是在告诉launchd,您的应用程序负责在侦听套接字上调用accept 以使用其中一个挂起的连接。如果不这样做,连接将在侦听套接字上保持排队,导致 launchd 认为您的应用程序仍有新工作要做。您可以确保您的应用程序在启动时调用 accept 以使用挂起的连接,或者指定 Wait = false 以让已启动以代表您调用 accept

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-13
      • 2018-01-08
      • 2011-03-27
      • 1970-01-01
      • 2016-07-26
      相关资源
      最近更新 更多