控制systemd服务的简单C或C ++ API

25

目标

我想编写C/C++应用程序,并为它们提供API,以便它们直接与systemd管理的服务通信。实际上,我希望我的应用程序能够执行相当于systemctl start service_name@unit_number.service的操作,但不能使用system()popen()exec()调用(硬性要求)。


问题

是否有一个与 systemd 通信的简单的 C/C++ API,假设 systemd 版本为219(即 CentOS v7.4,同时是硬性要求)?


目前的工作

  1. 我在网上搜寻了控制C/C++中systemd管理服务的例子,发现只有零星的讨论,但没有找到好的例子。
  2. 我可以反向工程systemctl版本219的源代码, 但这可能会违反GPL许可证。
  3. 由于我被困在CentOS v7.4中,因此无法使用新的“SD Bus”API的221或更高版本。 没有人会为了一个特定的应用程序的利益而允许手动升级libsystemd,而且我显然不是第一个提出这个问题的人。
  4. 我不愿意使用低级别的C API来处理DBUS,因为维护者自己都说“如果你直接使用这个低级别的API,你就要面对一些痛苦。”

硬性要求

  • systemd v219。
  • CentOS v7.4
  • C/C++。
  • 不使用system()/popen()/exec()调用systemctl CLI实用程序。
  • 非传播许可证(即LGPLv2可以,但首选BSD/MIT)。

问题(Redux)

在CentOS v7.4上,我能否使用更简单的API(即使需要自己提供共享库)以一种简单可靠的方式直接通过C / C ++代码与systemd通信? 如果现有的libdbus-1.so API过于复杂但仍然可靠,并且我可以创建一个可靠/稳定的包装器库,我愿意探索这个选项。 此外,如果可以手动构建和部署SD-BUS组件而不必修改/升级系统上已有的systemd库/守护程序,则我也可能采用这种方法。


编辑和评论

  • 我愿意使用成熟的C++库,只要它不需要完全释放所有源代码。

谢谢。


你有考虑过使用C++封装库吗?已经有一些现成的库可以使dbus库更易于使用。 - rm5248
@rm5248,如果不需要完全发布所有源代码,我愿意使用成熟的C++库。谢谢! - Cloud
由于systemd API作为一组D-Bus接口公开,这个问题基本上归结为“你推荐什么C/C++ D-Bus绑定?” - 这在现有答案中已经涵盖了这个现有答案,以及它们的优缺点。 - Philip Withnall
1个回答

3

如你所知,唯一与systemd交互的方式是使用dbus库,没有其他支持的方法。 即使你取消了不允许执行二进制文件的要求,这仍然会被看作是不好的做法,因为*ctl工具是命令行用户界面,不适用于从其他程序调用。


你也发现这似乎是一个常见的问题,并且新的“SD Bus” API解决了这个问题。为什么在制作了一个闪亮的新API来减轻痛苦时,还需要一个非痛苦的旧API? - Goswin von Brederlow
确实建议使用sd-bus..但从C++来看,他唯一成熟、经过充分测试和得到良好支持的选择就是qtdbus。 - Cristian Rodríguez

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接