Да; но сначала исправьте свою глючную программу, прежде чем возиться с systemd
MariusMatutiae совершенно правильно. У вас проблема с вашей программой. Это тупики. Возиться с systemd не ответ. В лучшем случае это отвлечение. Исправьте вашу программу, чтобы она не сломалась. Направьте свою энергию на нужную вещь.
Тем не менее, другие люди будут приходить сюда из-за названия вопроса, а не из-за вопроса. Для их выгоды вот ответ на заголовок, игнорируя сам вопрос:
Да, systemd может следить за демонами и автоматически перезапускать их, если они перестают говорить. Не просто старые демоны. Как отмечает mvp, нет никакого способа узнать, что демон завис (в этой вселенной, где проблема остановки нерешаема, по крайней мере). Ни systemd, ни какая-либо другая компьютерная программа никогда не смогут с нуля определить, что какая-то случайная программа, брошенная в них, зашла в тупик или зашла в бесконечный цикл, или что-то в этом роде. Лучшее, что вы здесь получите, это обнаружение того, что демон не выполнил регулярную операцию "сердцебиение" в течение требуемого промежутка времени.
Поэтому демонам, которые используют возможности сторожевого таймера systemd, необходимо писать на языке, специфичном для systemd, протоколе sd_notify. Это усложняет код DEMON. Это усложняется еще и потому, что демоны должны, если они написаны правильно, проверять, были ли они вызваны с включенной функцией сторожевого таймера.
Демон, который говорит на этом протоколе, чтобы использовать возможность сторожевого таймера systemd ...
- … Должен проверить переменную среды
WATCHDOG_USEC
;
- … Должен вызывать sd_notify() постоянно и часто, в течение всего срока службы, с установленной
WATCHDOG=1
, с интервалом около WATCHDOG_USEC
/2 ("USEC" обозначает микросекунды);
- … Должен быть установлен
Type=notify
в файле модуля;
- … Должен иметь
NotifyAccess=main
(или =all
), установленный в его файле модуля;
- … Должен иметь
WatchdogSec=
секунд, установленных в его файле модуля.
- … Необходимо связать с
libsystemd-daemon.so
Если вы хотите узнать подробности кодирования этого, после прочтения руководства убедитесь, что вы идете направо в StackExchange. Это SuperUser. StackOverflow находится там.
дальнейшее чтение