如何使用launchd启动应用程序的多个实例?

时间:2010-01-02 16:23:59

标签: launchd

我的申请分为两部分。主要应用程序和帮助工具。帮助工具执行具有提升权限的任务。

launchd plist看起来像这样:(仅包含重要设置。)

<key>UserName</key>
<string>root</string>
<key>ProgramArguments</key>
<array>
    <string>/Library/PrivilegedHelperTools/helperTool</string>
</array>
<key>Sockets</key>
<dict>
    <key>IPC</key>
    <dict>
        <key>SockPathName</key>
        <string>/tmp/TheSocket</string>
    </dict>
</dict>

有没有办法为套接字的每个连接启动一个新的帮助器实例?

或者,是否存在用于处理多个请求的现有模板? (我现在正在做这个,这是很多丑陋的代码。)

1 个答案:

答案 0 :(得分:1)

这可能是我在Stackoverflow中的第一个答案:)

首先,使用Wait to false设置inetdCompatibility。 这将使launchd接受套接字。

<key>inetdCompatibility</key>
<dict>
    <key>Instances</key>
    <integer>42</integer>
    <key>Wait</key>
    <false/>
</dict>

一旦,launchd接受了套接字。接受的套接字将作为STDIN_FILENO传递给您的程序。您的launchd进程可以按如下方式访问接受的套接字:(我从开源sshd复制了代码)

int sock_in;
int sock_out;           
sock_in = sock_out = dup(STDIN_FILENO);
NSLog(@"socket descriptor: %d", sock_in);

sock_in已被接受。所以你的程序可以在不调用accept的情况下使用它。

我假设您已经有一个plist,它将为您监控套接字端口。如果没有,可以按如下方式进行。它将使用IPv4 TCP创建一个launchd socket侦听端口18411。

<key>Sockets</key>
<dict>
    <key>Listeners</key>
    <dict>
        <key>SockServiceName</key>
        <string>18411</string>
        <key>SockType</key>
        <string>stream</string>
        <key>SockFamily</key>
        <string>IPv4</string>
    </dict>
</dict>