WatchdogSec для сервиса systemd с ненулевой меткой

Diamond

New member
Сообщения
2
#1
Добрый день. Проверяю работу параметра WatchdogSec в секции Service для сервиса.
1. Написал простое тестовое приложение на C++, Qt генерирующее сигнал sd_notify(0, "WATCHDOG=1") - сообщающий о том, что приложение "продолжает жить".

// Проверка того, что для сервиса включен параметр WatchdogSec
uint64_t watchdogTimeout = 0; // таймаут, микросекунд
int result = sd_watchdog_enabled(0, &watchdogTimeout);
if (result > 0) {
QTimer *watchdogTimer = new QTimer(this);
connect(watchdogTimer, &QTimer::timeout, this, []() { sd_notify(0, "WATCHDOG=1"); });
watchdogTimer->start(watchdogTimeout / 2000);
}


2. Написал простой сервис-юнит для запуска под 0 мандатной меткой.

[Unit]
Description=testdaemon service

[Service]
Type=simple
ExecStart=/opt/testdaemon
ExecReload=/bin/kill -HUP $MAINPID
WatchdogSec=10
Restart=always
PDPLabel=0:0:0

[Install]
WantedBy=multi-user.target


3. Запускаю. Проверяю. Работает - приложение каждые 5 секунд отправляет сигнал sd_notify(0, "WATCHDOG=1") (я жив), ОС понимает, что процесс активен и продолжает исправно работать.
4. Но если в сервис-юните исправить мандатный уровень на ненулевой, например, PDPLabel=2:0:0, то сигнал sd_notify(0, "WATCHDOG=1") перестаёт отправляться в ОС. Функция sd_notify() возвращает -1, и ОС через 10 секунд понимая, что процесс завис, перезапускает сервис.

В чём может быть проблема? Как заставить сервис успешно отправлять sd_notify() под ненулевой мандатной меткой?
 

Diamond

New member
Сообщения
2
#3
Пример посмотрел. К сожалению, он ничем не помог. Метод sd_notify() при вызове возвращает -1. А аналогичный systemd-notify возвращает ошибку: "failed to notify init system: Operation not permitted". То есть похоже, что системный сокет /var/run/systemd/notify, через который идёт обмен сообщениями sd_notify() между сервисом и ОС , работает только под 0 меткой. А ему бы как нибудь назначить привилегию PARSEC_CAP_PRIV_SOCK или ещё какую-нибудь хитрую.