#c #daemon #systemd #status #shutdown
#c #демон #systemd #Статус #завершение работы
Вопрос:
У меня возникли проблемы с пониманием модели Systemd для уведомлений и нескольких рабочих процессов. Уведомления Systemd происходят с использованием sd_notify (3)
интерфейса. sd_notify (3)
Интерфейсы предоставляют демону возможность сообщать systemd о своем состоянии:
#include <systemd/sd-daemon.h>
int sd_notify(int unset_environment,
const char *state);
int sd_notifyf(int unset_environment,
const char *format,
...);
...
Если я правильно анализирую справочную страницу, демон должен вызвать sd_notify(0, "READY=1n");
ее, как только она будет запущена и готова к обработке данных. И когда он останавливается, он должен вызвать sd_notify(0, "STOPPING=1n");
.
Вот один из рабочих процессов, с которым у меня возникли проблемы. Я не понимаю, как Systemd отправляет сообщение демону со словами «обновите свой статус», чтобы об этом можно было сообщить пользователю через systemctl status
.
systemctl status mydaemon.service
Другой рабочий процесс, с которым у меня возникли проблемы, — это завершение работы. Я не понимаю, как Systemd отправляет сообщение о завершении работы демону.
В обоих случаях я чувствую, что мой исполняемый файл должен экспортировать функцию, а Systemd должен вызывать ее для запросов и сообщений.
Как Systemd сообщает демону сообщить о своем статусе или завершении работы?
Ответ №1:
Как правило, systemd не отправляет сообщение вашему демону. Ваш демон должен генерировать уведомления о состоянии каждый раз, когда изменяется внутренний статус. В противном случае, если ваш процесс зависнет (временно или постоянно), запрос пользователя о статусе ничего не сделает. Обратите внимание, что также отображается вывод демона, поэтому, возможно, нет необходимости всегда вызывать sd_notify
.
Остановка обычно должна обрабатываться сигналом или, возможно, использоваться ExecStop=
для запуска fooctl
процесса, который отправляет сообщение через сокет и ожидает ответа.
Комментарии:
1. Спасибо. Проблема с «генерировать уведомления о состоянии каждый раз, когда изменяется внутренний статус» , заключается в том, что в нем указано только то, каким было состояние некоторое время назад. в прошлом. Он не может сообщать о зависших процессах, что кажется причиной, по которой кто-то мог бы
systemctl status mydaemon.service
. (Это та же проблема, что и при подписании кода — аттестация применяется только к некоторому коду в какой-то момент в прошлом. В нем ничего не говорится о текущем выполняемом коде).2. Чтобы уточнить, как вы описали, вы вообще не получите никакого вывода состояния. При том, как это работает на самом деле, вы просто получаете последнее обновление, которое полезно для ответа на вопрос «что оно делало во время зависания». Если вы хотите перехватить само зависание, установите
WatchdogSec=
.