Sim; mas primeiro corrija o seu programa de buggy antes de mexer no systemd.
MariusMatutiae está bastante correto. Você tem um problema com o seu programa. É um impasse. Brincar com systemd não é a resposta. Na melhor das hipóteses, é uma distração. Corrija seu programa para que não fique quebrado. Dirija suas energias para a coisa certa.
Dito isto, outras pessoas virão aqui por causa do título da pergunta, e não da pergunta propriamente dita. Para seu benefício, eis a resposta ao título, ignorando a pergunta:
Sim, o systemd pode monitorar daemons e reiniciá-los automaticamente se parar de falar. Não é apenas qualquer daemon antigo, no entanto. Como observa o mvp, não há como saber que um daemon travou (neste universo, onde o problema de parada é indecidível, pelo menos). Nem o systemd nem qualquer outro programa de computador serão capazes de deduzir do zero que algum programa aleatório jogado contra eles tenha um impasse, ou entrado em um loop infinito, ou o que seja. O melhor que você obterá aqui é detectar que um daemon não realizou uma operação regular de "batimento cardíaco" dentro de um período de tempo necessário.
Dæmons que tiram vantagem dos recursos de vigilância do systemd, portanto, precisam ser escritos para falar um protocolo específico do sistema, o protocolo sd_notify. Isso complica um pouco o código daemon. É ainda mais complicado porque os daemons devem, se escritos corretamente, verificar se foram invocados com a função watchdog ativada também.
Um daemon que fala esse protocolo para fazer uso da capacidade de vigilância do systemd…
- … Deve verificar a
WATCHDOG_USEC
variável de ambiente;
- … Deve chamar sd_notify () contínua e freqüentemente, ao longo de sua vida útil, com a
WATCHDOG=1
opção definida, em um intervalo de aproximadamente WATCHDOG_USEC
/ 2 ("USEC" significa microssegundos);
- … Deve ter
Type=notify
definido em seu arquivo de unidade;
- … Deve ter
NotifyAccess=main
(ou =all
) definido em seu arquivo de unidade;
- … Deve ter
WatchdogSec=
segundos definidos em seu arquivo de unidade.
- ... deve vincular com
libsystemd-daemon.so
Se você quiser saber os detalhes da codificação, depois de ler o manual, certifique-se de ir para o StackExchange certo. Este é o superusuário. O StackOverflow está lá .
Leitura adicional
for(;;) do_something();
?