【问题标题】:How can I launch multiple instances of an application using launchd?如何使用 launchd 启动应用程序的多个实例?
【发布时间】:2010-01-02 16:23:59
【问题描述】:

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

已启动的 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>

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

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

【问题讨论】:

    标签: launchd


    【解决方案1】:

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

    首先,将带有 Wait 的 inetdCompatibility 设置为 false。 这将使 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 创建一个启动的套接字侦听端口 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>
    

    【讨论】:

    • 感谢您的回答。我有点难过,这样做的唯一方法似乎是使用兼容性功能,而不是直接由 launchd 提供。我会让赏金再开放两天,也许其他人比我们知道的更多。
    猜你喜欢
    • 1970-01-01
    • 2010-09-19
    • 2014-05-18
    • 1970-01-01
    • 2011-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-07
    相关资源
    最近更新 更多