Execute um comando arbitrário quando um serviço falhar

11

Quero executar algum script quando um serviço falhar. A coisa mais próxima que eu vejo disso é a FailureAction=opção (na [Service]seção), mas ela oferece apenas comandos de reinicialização.

tshepang
fonte

Respostas:

11

Há uma OnFailure=diretiva na seção [Unit], documentada em systemd.unit (5) . É definido da seguinte forma:

Uma lista separada por espaços de uma ou mais unidades ativadas quando esta unidade entra no estado "com falha".

(Também há uma OnFailureJobMode=diretiva na mesma seção que permite definir o modo de trabalho para ativar OnFailure = units.)

intelfx
fonte
Parece que essas opções iniciam outras unidades, apenas scripts.
tshepang
2
@Tshepang: Claro. No systemd, uma unidade é, bem, uma unidade básica de fazer qualquer coisa. Escreva uma unidade simples para o seu script, coloque-a sob /etc/systemd/systeme coloque seu nome na OnFailure=diretiva.
Intelfx
2

Você também pode usar ExecStopPostpara executar um comando diretamente em vez de iniciar uma unidade.

Eu não estava feliz com o OnFailurecenário, então continuei procurando e encontrando ExecStopPost.

O exemplo real a seguir, se a tarefa principal falhar, o systemd executará um gitcomando.

[Unit]
Description=SRI Dispenser Server
ConditionPathExists=|/usr/bin/
After=sri-boot-dsp.service

[Service]
WorkingDirectory=/usr/share/sri/configurations/transmitter

User=root

# This is task to run when this service starts
ExecStart=/usr/bin/python -m sri.DispenserServer

# If any of the ExecStart tasks fail, then ExecStopPost will run
ExecStopPost=/bin/git checkout -- .

Restart=always
RestartSec=10
KillSignal=SIGKILL


[Install]
WantedBy=multi-user.target

https://www.freedesktop.org/software/systemd/man/systemd.service.html

ExecStopPost = Comandos adicionais que são executados após a interrupção do serviço. Isso inclui casos em que os comandos configurados no ExecStop = foram usados, onde o serviço não possui nenhum ExecStop = definido ou onde o serviço foi encerrado inesperadamente. Esse argumento usa várias linhas de comando, seguindo o mesmo esquema descrito para ExecStart =. O uso dessas configurações é opcional. A substituição do especificador e da variável de ambiente é suportada. Observe que - ao contrário de ExecStop = - os comandos especificados com essa configuração são chamados quando um serviço falha ao iniciar corretamente e é desligado novamente.

É recomendável usar essa configuração para operações de limpeza que devem ser executadas mesmo quando o serviço falhou ao iniciar corretamente. Os comandos configurados com essa configuração precisam poder operar, mesmo se o serviço falhar na inicialização até a metade e deixar dados incompletamente inicializados. Como os processos do serviço já foram finalizados quando os comandos especificados com esta configuração são executados, eles não devem tentar se comunicar com eles.

Observe que todos os comandos configurados com essa configuração são chamados com o código de resultado do serviço, bem como o código e o status de saída do processo principal, definidos nas variáveis ​​de ambiente $ SERVICE_RESULT, $ EXIT_CODE e $ EXIT_STATUS, consulte systemd.exec (5) para detalhes.

shrewmouse
fonte