Estou escrevendo um serviço systemd que pode ser iniciado ou interrompido usando comandos systemctl.
No entanto, este programa também pode retornar com vários códigos de retorno e eu gostaria de lidar com esses códigos de retorno.
Por exemplo, se o serviço foi interrompido systemctl stop <service>
, não deve fazer nada. Mas se não foi morto por systemctl e retornado por si só, quero executar um pós-script no qual eu possa obter o código de retorno e executar ações dependendo de seu valor.
Modificado após a resposta @NarūnasK
Ao ter a versão systemd >= v232, tudo bem com a resposta @NarūnasK
No entanto, ao não ter a boa versão do systemd, como isso poderia ser feito?
Eu pensei em fazer algo como
ExecStart=/bin/sh -c '<service> -C /etc/<service_conf_file>; [ $? -eq 1 ] && { <action> }'
ExecStopPost= deve fazer o que você deseja.
Em seu script, você pode ler
$EXIT_CODE
ou$EXIT_STATUS
variáveis de ambiente e tomar as medidas apropriadas.EDITAR
Você pode usar a seguinte solução alternativa com
systemd < 232
.amostra_script :
exit_handler :
sample_script.service :
Status do sample_script.service :
Você pode ver que
exit_handler
foi chamado duas vezes. A princípio debash
onde tem o código de saída fornecido a ele e depois comoExecStopPost=
script, onde o argumento posicional do código de saída não foi fornecido, portanto, imprimiu N/A.