GNU/Linux >> Tutoriels Linux >  >> Debian

Debian – Bonne façon d'utiliser Onfailure dans Systemd ?

J'ai un service exécutant un logiciel qui génère des fichiers de configuration s'ils n'existent pas et les lit s'ils existent. Le problème auquel j'ai été confronté est que ces fichiers sont parfois corrompus, empêchant le logiciel de démarrer et provoquant ainsi l'échec du service. Dans ce cas, je voudrais supprimer ces fichiers et redémarrer le service.

J'ai essayé de créer un service qui devrait être exécuté en cas d'échec, en procédant comme suit :

[Service]
ExecStart=/bin/run_program
OnFailure=software-fail.service

où se trouve ce service :

[Service]
ExecStart=/bin/rm /file/to/delete
ExecStop=systemctl --user start software.service

Le problème, cependant, est que ce service ne démarre pas, même en cas d'échec du service.
J'ai essayé de le faire

systemctl --user enable software-fail.service

mais ensuite, il démarre à chaque démarrage du système, comme n'importe quel autre service.

Ma solution temporaire consiste à utiliser

ExecStopPost=/bin/rm /file/to/delete

mais ce n'est pas un moyen satisfaisant de le résoudre, car il supprimera toujours le fichier à l'arrêt du service, que ce soit à cause d'un échec ou non.

Sortie en cas d'échec :

● 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'.

La sortie de systemctl –user status software-fail.service
est :

● software-fail.service - Delete corrupt files
   Loaded: loaded (/home/trippelganger/.config/systemd/user/software-fail.service; disabled; vendor preset: enabled)
   Active: inactive (dead)

Réponse acceptée :

REMARQUE  :Vous souhaitez probablement utiliser ExecStopPost= au lieu de OnFailure= ici (voir mon autre réponse), mais cela essaie de comprendre pourquoi votre OnFailure= la configuration ne fonctionne pas.

Le problème avec OnFailure= ne pas démarrer l'unité peut être parce qu'elle est dans la mauvaise section, elle doit être dans le [Unit] section et non [Service] .

Vous pouvez essayer ceci à la place :

# software.service
[Unit]
Description=Software
OnFailure=software-fail.service

[Service]
ExecStart=/bin/run_program

Et :

# software-fail.service
[Unit]
Description=Delete corrupt files

[Service]
ExecStart=/bin/rm /file/to/delete
ExecStop=/bin/systemctl --user start software.service

Je peux le faire fonctionner avec cette configuration.

Mais notez que l'utilisation de OnFailure= n'est pas idéal ici, car vous ne pouvez pas vraiment dire pourquoi le programme a échoué, et enchaîner un autre démarrage dans ExecStop= en appelant /bin/systemctl start directement est assez hacky… La solution utilisant ExecStopPost= et regarder le statut de sortie est définitivement supérieur.

Si vous définissez OnFailure= à l'intérieur de [Service] , systemd (au moins la version 234 de Fedora 27) se plaint avec :

software.service:6: Unknown lvalue 'OnFailure' in section 'Service'

Vous ne savez pas si vous voyez cela dans vos journaux ou non… (Peut-être que cela a été ajouté dans un systemd récent ?) Cela devrait être un indice de ce qui se passe là-bas.

En relation:Différence entre '>' et '-gt'?
Debian
  1. Comment Systemd utilise-t-il les scripts /etc/init.d ?

  2. Debian - Service actif mais (quitté) ?

  3. Debian - Vous ne savez pas ce qui démarre ce fichier d'unité Systemd ?

  4. Debian - Systemd :le service ne dispose pas des paramètres Execstart=et Execstop=. Refusant?

  5. Debian – Utiliser Aes-ni dans Debian ?

Comment installer et utiliser FFmpeg sur Debian 10

Comment installer le logiciel de surveillance Icinga 2 sur Debian 10

Comment installer et utiliser Monit sur Debian 9 / Ubuntu 16.04

Comment utiliser la commande grep sur Debian 10

Comment installer Icinga 2 sur Debian 8

Manière correcte d'utiliser Ubuntu systemctl pour contrôler Systemd