Описание тега sierra-leone
В нашем встроенного устройства у нас есть главное приложение и несколько сервисов. Обе основные приложения и сервисы управляются systemd.
Основное приложение имеет систему плагинов, Плагины может быть включена или отключена во время выполнения. Скажем, у нас есть PluginA
и PluginB
. Обе эти плагины требуют обслуживания, назовем его ServiceP
.
Теперь, если у нас только один плагин, мы бы начали ServiceP
во время нагрузки и остановить службу во время выгрузки. Но так как у нас есть два плагина, и их жизни могут пересекаться, нам нужны некоторые динамические зависимости или счетчик ссылок:
PluginA загружена --> начать ServiceP
PluginB загружена --> ничего не делать (уже начал PluginA)
PluginA выгружается --> ничего не делать (все-таки требует PluginB)
PluginB выгружается --> остановка ServiceP
Есть ли способ, как это сделать с systemd?
Я предполагаю, что нет, так как systemd в целом управляет приложений. Так что если мы реализуем счетчик ссылок на себя, мы могли бы кое-что как это:
# корпус 1
Приложение запускается (не начинайте ServiceP, приложение не просил еще)
Приложение говорит, что он должен ServiceP --> начать ServiceP
Приложение говорит, что он больше не нуждается в ServiceP --> остановка ServiceP
случай # 2
Приложение говорит, что он должен ServiceP --> начать ServiceP
Приложение останавливается/зависает --> остановка ServiceP
...
Я предполагаю, что это будет довольно легко достичь этого путем добавления/удаления зависимости в устройство файлов и их перезагрузки. Но когда приложение
вылетает, его не остановят ServiceP
, поэтому мне нужно, чтобы выполнить операцию очистки в ExecStopPost=
. Это означает вызов systemctl демон-перезарядка
от Блока файла, который не кажется правильным. Есть ли лучшее решение?