O systemd pode detectar e eliminar processos travados?


16

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.


Provavelmente não. Como você sabe se o processo está travado? E se você realmente precisar de algo assim for(;;) do_something();?
Mvp

4
Estritamente falando, se o seu código travar, você deve depurar esse problema. Matá-lo via systemd (supondo que possa ser feito, o que eu não acredito) ou de qualquer outra maneira é a coisa certa a ser feita quando você o depura. Mas você simplesmente não pode deixá-lo livre para entrar em um impasse.
MariusMatutiae

Respostas:


25

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_USECvariável de ambiente;
  • … Deve chamar sd_notify () contínua e freqüentemente, ao longo de sua vida útil, com a WATCHDOG=1opção definida, em um intervalo de aproximadamente WATCHDOG_USEC/ 2 ("USEC" significa microssegundos);
  • … Deve ter Type=notifydefinido 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á .

Leitura adicional


2
Claro, eu tenho que corrigir o problema, minha única intenção era ter um hack temporário até que eu resolvesse o problema. Obrigado pela resposta detalhada.
livre-pensador
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.