GNU/Linux >> Linux Esercitazione >  >> Debian

Debian:modo corretto di utilizzare Onfailure in Systemd?

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"?
Debian
  1. In che modo Systemd utilizza gli script /etc/init.d?

  2. Abilitazione condizionata dei file Systemd tramite Debian Packaging?

  3. Debian – Servizio attivo ma (chiuso)?

  4. Debian – Systemd:il servizio manca sia dell'impostazione Execstart=che di Execstop=. Rifiutare?

  5. Debian – Usare Aes-ni in Debian?

Come installare e utilizzare FFmpeg su Debian 10

Come installare il software di monitoraggio Icinga 2 su Debian 10

Come installare e utilizzare Monit su Debian 9 / Ubuntu 16.04

Come usare il comando grep su Debian 10

Come installare Icinga 2 su Debian 8

Modo corretto di usare Ubuntu systemctl per controllare Systemd