c - 用于控制 systemd 服务的简单 C 或 C++ API
问题描述
目标
我想编写 C/C++ 应用程序并为它们提供一个 API 以直接与systemd
-managed 服务通信。实际上,我希望我的应用程序能够在systemctl start service_name@unit_number.service
不使用system()
、popen()
或exec()
调用的情况下执行等效操作(硬要求)。
问题
假设版本 219(即 CentOS v7.4,也是硬要求),是否有一个简单的C/C++ API 用于通信?systemd
systemd
工作至今
- 我在网上搜索
systemd
了 C/C++ 中控制管理服务的示例,并发现了关于该主题的奇怪讨论,但没有找到任何好的示例。 systemctl
我总是可以从 source 对版本 219 进行逆向工程,但是我可能会违反 GPL 许可。- 由于我坚持使用 CentOS v7.4,这意味着我无法获得 systemd 的 221 或更高版本,因此我无法使用更新的“SD Bus”API。 没有人会为了特定应用程序的好处而允许手动升级
libsystemd
,而且我显然不是第一个提出这种担忧的人。 - 我对使用 DBUS 的低级 C API 犹豫不决,因为维护者自己说“如果你直接使用这个低级 API,你注册会有些痛苦。 ”。
硬性要求
systemd
v219。- CentOS v7.4
- C/C++。
- 否
system()
//调用CLI 实用程序popen()
。exec()
systemctl
- 非传播许可证(即 LGPLv2 可以,但首选 BSD/MIT)。
问题(Redux)
是否有一个更简单的 API 可以在 CentOS v7.4 上使用(即使我必须自己提供共享库),它可以用来systemd
直接通过 C/C++ 代码以简单、可靠的方式进行通信?如果现有的libdbus-1.so
API 很复杂但仍然可靠,并且我可以围绕它创建一个可靠/稳定的包装库,我愿意探索该选项。此外,如果可以手动构建和部署独立于 SD-BUS 组件systemd
并使用它们,而无需修改/升级systemd
系统上已经存在的库/守护程序,我也可能会走这条路。
编辑和评论
- 我愿意使用成熟的 C++ 库,只要它不需要全部发布所有源代码。
谢谢你。
解决方案
正如您已经知道的那样,您应该只使用 dbus 库与 systemd 交互,没有其他支持的方式可以这样做。即使您取消了不执行二进制文件的要求,它仍然会被拒绝,因为 *ctl 工具是命令行用户界面,并非旨在或设计为从其他程序调用。