Ho un servizio che esegue un software che genera alcuni file di configurazione se non esistono e li legge se esistono. Il problema che ho dovuto affrontare è che questi file a volte vengono danneggiati, rendendo impossibile l'avvio del software e quindi facendo fallire il servizio. In questo caso vorrei rimuovere questi file e riavviare il servizio.
Ho provato a creare un servizio che dovrebbe essere eseguito in caso di errore, in questo modo:
[Service]
ExecStart=/bin/run_program
OnFailure=software-fail.service
dove si trova questo servizio:
[Service]
ExecStart=/bin/rm /file/to/delete
ExecStop=systemctl --user start software.service
Il problema, tuttavia, è che questo servizio non si avvia, anche quando il servizio non è riuscito.
Ho provato a farlo
systemctl --user enable software-fail.service
ma poi si avvia ad ogni avvio del sistema, proprio come qualsiasi altro servizio.
La mia soluzione temporanea è usare
ExecStopPost=/bin/rm /file/to/delete
ma questo non è un modo soddisfacente per risolverlo, poiché eliminerà sempre il file all'interruzione del servizio, indipendentemente dal fatto che sia dovuto a un errore o meno.
Output in caso di errore:
● software.service - Software
Loaded: loaded (/home/trippelganger/.config/systemd/user/software.service; enabled; vendor preset: enabled)
Active: failed (Result: exit-code) since Fri 2018-05-04 09:05:26 CEST; 5s ago
Process: 1839 ExecStart=/bin/run_program (code=exited, status=1/FAILURE)
Main PID: 1839 (code=exited, status=1/FAILURE)
May 04 09:05:26 trippelganger systemd[595]: software.service: Main process exited, code=exited, status=1/FAILURE
May 04 09:05:26 trippelganger systemd[595]: software.service: Unit entered failed state.
May 04 09:05:26 trippelganger systemd[595]: software.service: Failed with result 'exit-code'.
L'output di systemctl –user status software-fail.service
è:
● software-fail.service - Delete corrupt files
Loaded: loaded (/home/trippelganger/.config/systemd/user/software-fail.service; disabled; vendor preset: enabled)
Active: inactive (dead)
Risposta accettata:
NOTA :Probabilmente vuoi usare ExecStopPost=
invece di OnFailure=
qui (vedi la mia altra risposta), ma questo sta cercando di risolvere il motivo per cui il tuo OnFailure=
l'installazione non funziona.
Il problema con OnFailure=
il mancato avvio dell'unità potrebbe essere dovuto al fatto che è nella sezione sbagliata, deve essere nella [Unit]
sezione e non [Service]
.
Puoi invece provare questo:
# software.service
[Unit]
Description=Software
OnFailure=software-fail.service
[Service]
ExecStart=/bin/run_program
E:
# software-fail.service
[Unit]
Description=Delete corrupt files
[Service]
ExecStart=/bin/rm /file/to/delete
ExecStop=/bin/systemctl --user start software.service
Posso farlo funzionare con questa configurazione.
Ma nota che usando OnFailure=
non è l'ideale qui, dal momento che non puoi davvero dire perché il programma non è riuscito e concatenarne un altro inizio in ExecStop=
chiamando /bin/systemctl start
direttamente è piuttosto complicato... La soluzione usando ExecStopPost=
e guardare lo stato di uscita è decisamente superiore.
Se definisci OnFailure=
all'interno di [Service]
, systemd (almeno la versione 234 di Fedora 27) si lamenta con:
software.service:6: Unknown lvalue 'OnFailure' in section 'Service'
Non sono sicuro se lo vedi nei tuoi log o meno... (Forse questo è stato aggiunto in un recente systemd?) Dovrebbe essere un suggerimento di cosa sta succedendo lì.
Correlati:differenza tra ">" e "-gt"?