Добрый день. Проверяю работу параметра 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() под ненулевой мандатной меткой?
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() под ненулевой мандатной меткой?