Enquanto trabalhava em uma solução que usa bloqueio de arquivos, acredito que meu código está entrando em um impasse. Estou usando o systemd para iniciar o processo na inicialização do sistema. Usar o alarme (3) é uma opção, mas eu queria saber se existe alguma maneira de o systemd detectar processos interrompidos e reiniciá-los?
Atualmente, para contornar esse problema, por enquanto, planejo analisar a saída do journalctl e, se ela não mudar por um período de tempo especificado, eu mataria o processo por meio de um script de shell.
Basta saber se há uma maneira melhor de monitorar processos através do systemd ou não.
monitoring
systemd
pensador livre
fonte
fonte
for(;;) do_something();
?Respostas:
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…
WATCHDOG_USEC
variável de ambiente;WATCHDOG=1
opção definida, em um intervalo de aproximadamenteWATCHDOG_USEC
/ 2 ("USEC" significa microssegundos);Type=notify
definido em seu arquivo de unidade;NotifyAccess=main
(ou=all
) definido em seu arquivo de unidade;WatchdogSec=
segundos definidos em seu arquivo de unidade.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
fonte