receber notificação quando o serviço monitorado pelo sistema entrar no estado de falha


32

Eu preciso que as mensagens de rede sejam enviadas quando um serviço do systemd em que estou travado ou travado (ou seja, entra no estado de falha; eu monitoro o travamento usando o WatchdogSec =). Percebi que o sistema mais recente tinha FailureAction =, mas depois vi que isso não permite comandos arbitrários, mas apenas reinicialização / desligamento.

Especificamente, eu preciso de uma maneira de enviar uma mensagem de rede quando o systemd detectar que o programa travou e outra quando detectar que ele travou.

Espero uma resposta melhor do que "analisar os logs" e preciso de algo que tenha um tempo de resposta quase instantâneo, para que eu não pense que uma abordagem de pesquisa seja boa; deve ser algo desencadeado pela ocorrência do evento.


Você pode fornecer um exemplo (mesmo que não funcione) do que você está tentando alcançar?
Dawud 27/05

Você pode editar sua pergunta para adicionar essas informações em vez de adicioná-las a um comentário? :)
Dawud

Respostas:


31

As unidades systemd suportam o OnFailure que ativará uma unidade (ou mais) quando a unidade falhar. Você pode colocar algo como

 OnFailure=notify-failed@%n

E, em seguida, crie o notify-failed@.serviceserviço onde você pode usar o especificador necessário (você provavelmente desejará pelo menos% i) para iniciar o script ou comando que enviará a notificação.

Você pode ver um exemplo prático em http://nouthernlightlabs.se/systemd.status.mail.on.unit.failure


5
Existem algumas correções necessárias para as instruções no site vinculado. Primeiro, notify%n.serviceé redundante e resultará em notify@my-service.service.service. Segundo, %ideve ser usado em vez de %I, ou todos os traços no nome serão convertidos em barras.
orodbhen

4
Existe uma maneira de fazer isso para várias ou todas as unidades, sem modificar seus arquivos de unidade?
Vladimir Panteleev

16

Apenas minha maneira de notificar:

/etc/systemd/system/notify-email@.service

[Unit]
Description=Sent email 

[Service]
Type=oneshot
ExecStart=/usr/bin/bash -c '/usr/bin/systemctl status %i | /usr/bin/mailx -Ssendwait -s "[SYSTEMD_%i] Fail" your_admin@company.blablabla'

adicione ao systemd:

systemctl enable /etc/systemd/system/notify-email@service

Em outros serviços, adicione:

[Unit]
OnFailure=notify-email@%i.service

Recarregue a configuração:

systemctl daemon-reload

Existe uma maneira de evitar acioná-lo várias vezes seguidas? Em algumas situações, receber 1 mil e-mails sobre um serviço que falhou à noite e tentou repetidamente para reiniciar a si mesmo não é útil.
starbeamrainbowlabs 20/09

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.