Você também pode usar ExecStopPost
para executar um comando diretamente em vez de iniciar uma unidade.
Eu não estava feliz com a configuração OnFailure
, então continuei procurando e encontrei ExecStopPost
.
O exemplo real a seguir, se a tarefa principal falhar, o systemd executará um comando git
.
[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
link
ExecStopPost= Additional commands that are executed after the service
is stopped. This includes cases where the commands configured in
ExecStop= were used, where the service does not have any ExecStop=
defined, or where the service exited unexpectedly. This argument takes
multiple command lines, following the same scheme as described for
ExecStart=. Use of these settings is optional. Specifier and
environment variable substitution is supported. Note that – unlike
ExecStop= – commands specified with this setting are invoked when a
service failed to start up correctly and is shut down again.
It is recommended to use this setting for clean-up operations that
shall be executed even when the service failed to start up correctly.
Commands configured with this setting need to be able to operate even
if the service failed starting up half-way and left incompletely
initialized data around. As the service's processes have been
terminated already when the commands specified with this setting are
executed they should not attempt to communicate with them.
Note that all commands that are configured with this setting are
invoked with the result code of the service, as well as the main
process' exit code and status, set in the $SERVICE_RESULT, $EXIT_CODE
and $EXIT_STATUS environment variables, see systemd.exec(5) for
details.