15

Работая над решением, использующим блокировку файлов, я считаю, что мой код зашел в тупик. Я использую systemd, чтобы запустить процесс при запуске системы. Использование alarm(3) - вариант, но мне было интересно, есть ли способ для systemd обнаружить зависшие процессы и перезапустить их?

В настоящее время, чтобы обойти эту проблему, я планирую просмотреть вывод journalctl, и если он не будет изменяться в течение определенного периода времени, то я убью процесс с помощью сценария оболочки.

Просто интересно, есть ли лучший способ отслеживать процессы через systemd или иным образом.

1 ответ1

24

Да; но сначала исправьте свою глючную программу, прежде чем возиться с 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 находится там.

дальнейшее чтение

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .