在 macOS 中以编程方式启用、禁用和启动服务

2023-11-27

我正在编写一个附带服务的程序。到目前为止,我所做的是创建一个辅助工具,它可以为我的进程运行提升的任务,并可以通过 XPC 进行通信。

我的程序与一项服务捆绑在一起,我想使用帮助工具来安装和启动/停止该服务,以便我的程序可以在设置中具有“随系统启动服务”复选框。

我可以成功复制该服务的 plist,但找不到任何方法以编程方式启用、禁用、启动或停止该服务。我认为解决方案是打电话system("launchctl load /path/to/service.plist");很难看。目标 C 中是否有任何机制来完成此任务并获得成功或失败的结果?


Apple 有一个已弃用的 C API,用于启动、停止和启用 launchd 服务launch.h。 API 的源代码位于其开源网站上:https://opensource.apple.com/source/launchd/launchd-442.26.2/liblaunch/

以下是一些要求 launchd 启动 LittleSnitchUIAgent 服务的示例代码:

#include <launch.h>

int main(int argc, const char * argv[]) {
    const char *job = "at.obdev.LittleSnitchUIAgent";
    launch_data_t resp, msg;
    msg = launch_data_alloc(LAUNCH_DATA_DICTIONARY);
    launch_data_dict_insert(
        msg, launch_data_new_string(job), LAUNCH_KEY_STARTJOB);
    resp = launch_msg(msg);
    launch_data_free(msg);
    return 0;
}

LittleSnitchUIAgent 没有任何意义——我从本地服务列表中随机选择了它。我在示例中留下了错误检查,以使其保持简单。

如果您还没有,我建议您提供启动手册页守护进程和服务编程指南一项非常仔细的研究。 Launchd 可以启动您的进程来响应几乎任何事情:计时器、套接字连接、添加到系统的设备等等。您实际上很少需要管理自己的服务。我无法证实这一点,但我怀疑这就是他们弃用该 API 的原因。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 macOS 中以编程方式启用、禁用和启动服务 的相关文章

随机推荐