Простой C или C++ API для управления сервисами systemd

Цель

Я хотел бы написать приложения C / C++ и предоставить им API для прямой связи с управляемыми systemd службами. Фактически, я бы хотел, чтобы мои приложения могли выполнять эквивалент systemctl start service_name@unit_number.service без использования вызовов system(), popen() или exec() (жесткое требование).


Вопрос

Есть ли API просто C / C++ для связи с systemd, при условии, что systemd версии 219 (то есть CentOS v7.4, также жесткое требование)?


Работа до сих пор

  1. Я поискал в Интернете примеры управления службами, управляемыми systemd, на C / C++ и нашел странное обсуждение по теме, но не нашел хороших примеров.
  2. Я всегда мог перепроектировать systemctl версия 219 из исходников, но тогда я потенциально мог нарушить лицензию GPL.
  3. Поскольку я застрял на CentOS v7.4, а это означает, что я не могу получить версию systemd 221 или более позднюю, я не могу использовать новый API «SD Bus».Никто не позволит вручную обновить libsystemd только для конкретных целей, и я, по-видимому, не первый, кто поднимает эту проблему.
  4. Я не решаюсь использовать низкоуровневый API C для DBUS, поскольку сами сопровождающие указывают «Если вы используете этот низкоуровневый API напрямую, вы подпишетесь из-за некоторой боли.».

Жесткие требования

  • systemd v219.
  • CentOS v7.4
  • C / C++.
  • system() / popen() / exec() не обращаются к утилите systemctl CLI.
  • Нераспространяющаяся лицензия (например, LGPLv2 в порядке, хотя BSD / MIT предпочтительнее).

Вопрос (Redux)

Есть ли более простой API, который я мог бы использовать в CentOS v7.4 (даже если я должен сам предоставить общую библиотеку), который можно использовать для связи с systemd простым и надежным способом напрямую через код C / C++? Если существующий API libdbus-1.so сложен, но все же надежен, и я могу создать на его основе надежную / стабильную библиотеку-оболочку, я готов изучить этот вариант. Кроме того, если возможно вручную собрать и развернуть компоненты SD-BUS независимо от systemd и использовать их без необходимости изменять / обновлять библиотеку / демон systemd, уже находящиеся в системе, я потенциально мог бы пойти по этому пути.


Правки и комментарии

  • Я был бы открыт для использования зрелой библиотеки C++, если она не требует полного выпуска всего исходного кода.

Спасибо.

Вы изучали возможность использования библиотеки-оболочки C++? Уже существует несколько, которые упрощают использование библиотеки dbus.

rm5248 10.06.2018 18:27

@ rm5248 Я был бы открыт для использования зрелой библиотеки C++, если она не требует полного выпуска всего исходного кода. Спасибо!

Cloud 10.06.2018 20:56

Поскольку API-интерфейс systemd представлен как набор интерфейсов D-Bus, этот вопрос по существу сводится к «какие привязки C / C++ D-Bus вы рекомендуете?», Который рассматривается в этот существующий ответ вместе с их плюсами и минусами.

Philip Withnall 11.06.2018 00:40
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
19
3
7 049
1

Ответы 1

Как вы уже поняли, вы должны взаимодействовать с systemd только с помощью библиотеки dbus, другого поддерживаемого способа для этого нет. Даже если вы отменили требование об отсутствии выполнения двоичных файлов, оно останется неодобрительным, поскольку инструменты * ctl представляют собой командную строку пользовательские интерфейсы, не предназначенную или предназначенную для вызова из других программ.

Вы также поняли, что это обычная проблема, и новый API «SD Bus» ее решает. Как вы думаете, почему существует безболезненный старый API, когда они сделали блестящий новый API менее болезненным?

Goswin von Brederlow 21.06.2018 15:31

Действительно рекомендуется использовать sd-bus ... но из C++ в значительной степени единственный зрелый, хорошо протестированный и хорошо поддерживаемый вариант, который у него есть, - это qtdbus.

Cristian Rodríguez 21.06.2018 15:38

Другие вопросы по теме