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.

Mostrar nome
fonte
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 [email protected]serviç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

Pablo Martinez
fonte
5
Existem algumas correções necessárias para as instruções no site vinculado. Primeiro, notify%n.serviceé redundante e resultará em [email protected]. 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/[email protected]

[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" [email protected]'

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
ceinmart
fonte
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