O systemd pode detectar e eliminar processos pendentes?

14

Ao trabalhar em uma solução que usa o bloqueio de arquivos, acredito que meu código esteja 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 uma maneira do systemd detectar processos travados e reiniciá-los?

Atualmente, para contornar este problema por enquanto, estou planejando examinar a saída do journalctl e, se ela não for alterada por um período de tempo especificado, eu mataria o processo por meio de um script de shell.

Estou apenas imaginando se existe uma maneira melhor de monitorar processos por meio do systemd ou de outra forma.

    
por freethinker 16.12.2013 / 11:06

1 resposta

23

Sim; mas primeiro corrija seu programa de bugs antes de mexer com o systemd.

MariusMatutiae está correto. Você tem um problema com o seu programa. Isso é um impasse. Brincando com systemd não é a resposta. Na melhor das hipóteses, é uma distração. Corrija seu programa para que ele não seja quebrado. Direcione suas energias para a coisa certa.

Dito isto, outras pessoas virão aqui por causa do título da pergunta, em vez da pergunta apropriada. Para o benefício deles, aqui está a resposta para o título, ignorando a questão:

Sim, o systemd pode monitorar os daemons e reiniciá-los automaticamente se eles pararem de falar. Não apenas qualquer velho daemon, no entanto. Como observa o mvp, não há como saber que um daemon foi pendurado (neste universo, onde o problema da suspensão é indecidível, pelo menos). Nem o systemd nem qualquer outro programa de computador jamais será capaz de deduzir a partir do zero que algum programa aleatório lançado para eles tenha um impasse, ou entrado em um loop infinito, ou o que quer que seja. O melhor que você vai conseguir aqui é detectar que um daemon não realizou uma operação regular de "pulsação" dentro de um tempo necessário.

Os daemons que aproveitam os recursos do watchdog do systemd, portanto, precisam ser escritos para falar um protocolo específico do systemd, o protocolo sd_notify. Isso complica o código do daemon um pouco. É mais complicado porque os daemons devem, se escritos corretamente, verificar se foram chamados com a função watchdog também.

Um daemon que fala este protocolo para fazer uso da capacidade de vigilância do systemd…

  • … deve verificar a variável de ambiente WATCHDOG_USEC ;
  • … deve ligar sd_notify () de forma contínua e frequente, ao longo da sua vida útil, com a WATCHDOG=1 conjunto de opções, em um intervalo de cerca de 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 definido 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 ao StackExchange correto. Este é o SuperUser. O StackOverflow é ao lado .

Leitura adicional

por 16.12.2013 / 20:15