2

我试图找出一种在 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>

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

任何帮助表示赞赏,文斯

4

1 回答 1

3

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

于 2013-07-05T01:09:13.470 回答