首页 > 解决方案 > 用于控制 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 用于通信?systemdsystemd


工作至今

  1. 我在网上搜索systemd了 C/C++ 中控制管理服务的示例,并发现了关于该主题的奇怪讨论,但没有找到任何好的示例。
  2. systemctl我总是可以从 source 对版本 219 进行逆向工程,但是我可能会违反 GPL 许可。
  3. 由于我坚持使用 CentOS v7.4,这意味着我无法获得 systemd 的 221 或更高版本,因此我无法使用更新的“SD Bus”API。 没有人会为了特定应用程序的好处而允许手动升级libsystemd,而且我显然不是第一个提出这种担忧的人。
  4. 我对使用 DBUS 的低级 C API 犹豫不决,因为维护者自己说“如果你直接使用这个低级 API,你注册会有些痛苦。 ”。

硬性要求


问题(Redux)

是否有一个更简单的 API 可以在 CentOS v7.4 上使用(即使我必须自己提供共享库),它可以用来systemd直接通过 C/C++ 代码以简单、可靠的方式进行通信?如果现有的libdbus-1.soAPI 很复杂但仍然可靠,并且我可以围绕它创建一个可靠/稳定的包装库,我愿意探索该选项。此外,如果可以手动构建和部署独立于 SD-BUS 组件systemd并使用它们,而无需修改/升级systemd系统上已经存在的库/守护程序,我也可能会走这条路。


编辑和评论

谢谢你。

标签: clinuxservicesystemddbus

解决方案


正如您已经知道的那样,您应该只使用 dbus 库与 systemd 交互,没有其他支持的方式可以这样做。即使您取消了不执行二进制文件的要求,它仍然会被拒绝,因为 *ctl 工具是命令行用户界面,并非旨在或设计为从其他程序调用。


推荐阅读