72 votes

Comment supprimer les unités systemd manquantes ?

J'ai du mal à trouver comment supprimer les unités systemd qui n'ont plus de fichiers. Elles semblent toujours s'attarder dans le système d'une manière ou d'une autre.

Les vieilles unités cassées que j'essaie d'enlever :

core@ip-172-16-32-83 ~ $ systemctl list-units --all firehose-router*
  UNIT                       LOAD      ACTIVE SUB    DESCRIPTION
<E2><97><8F> firehose-router@02.service not-found failed failed firehose-router@02.service
<E2><97><8F> firehose-router@03.service not-found failed failed firehose-router@03.service

LOAD   = Reflects whether the unit definition was properly loaded.
ACTIVE = The high-level unit activation state, i.e. generalization of SUB.
SUB    = The low-level unit activation state, values depend on unit type.

2 loaded units listed.
To show all installed unit files use 'systemctl list-unit-files'.

Les fichiers n'existent pas, pourtant un rechargement a toujours ces unités qui traînent :

core@ip-172-16-32-83 ~ $ systemctl list-unit-files firehose-router@02.service
core@ip-172-16-32-83 ~ $ sudo systemctl daemon-reload
core@ip-172-16-32-83 ~ $ systemctl list-units --all firehose-router*
  UNIT                       LOAD      ACTIVE SUB    DESCRIPTION
<E2><97><8F> firehose-router@02.service not-found failed failed firehose-router@02.service
<E2><97><8F> firehose-router@03.service not-found failed failed firehose-router@03.service

LOAD   = Reflects whether the unit definition was properly loaded.
ACTIVE = The high-level unit activation state, i.e. generalization of SUB.
SUB    = The low-level unit activation state, values depend on unit type.

2 loaded units listed.
To show all installed unit files use 'systemctl list-unit-files'.

Il n'y a pas de fichiers les concernant que je puisse trouver :

core@ip-172-16-32-83 ~ $ sudo find /var/run/systemd -name "*firehose-router*"
core@ip-172-16-32-83 ~ $ find /etc/systemd/ -name "*firehose-router*"
core@ip-172-16-32-83 ~ $ find /usr/lib/systemd/ -name "*firehose-router*"
core@ip-172-16-32-83 ~ $

Alors, comment puis-je m'en débarrasser ?

134voto

user227117 Points 1086

La commande que vous cherchez est systemctl reset-failed

4voto

AaronDanielson Points 171

Lorsque systemd analyse les fichiers de définition d'unité, il prend note de toutes les autres unités liées appelées dans le fichier - que ces autres unités existent ou non.

$ systemctl --state=not-found --all
> ( ...prints list of 'not-found' units )

$ grep -r "<missing-unit>" /usr/lib/systemd/system
> ( returns files with references to <missing-unit> )

Lorsqu'une unité apparaît comme "introuvable", il ne s'agit pas nécessairement d'une erreur - tout ce que nous savons, c'est qu'une définition d'unité locale prétend avoir une certaine relation avec elle. Cette relation peut ne pas être importante pour nous. Par exemple, il peut s'agir de "Before:" une autre unité, mais nous n'utilisons pas cette autre unité.

4voto

mbigras Points 249
  • failed - se produit lorsqu'une unité est entrée dans un état d'échec et peut être réinitialisée avec la fonction systemctl reset-failed commande
  • not-found - se produit lorsque vous avez supprimé une unité mais que systemd a toujours une référence à celle-ci, comme lorsqu'une unité est activée et qu'un lien symbolique est placé dans le répertoire /etc/systemd/system ce problème peut être corrigé en supprimant les références à l'unité dans les documents suivants /etc/system/systemd/*.wants/ puis en cours d'exécution systemctl daemon-reload

Par exemple, supposez le bash script suivant :

#!/bin/bash
# script.sh
while true
do
    sleep 1
done

Et 3 unités systemd : example-foo.service , example-bar.service et example-baz.service

$ sudo systemctl cat example-{foo,bar,baz}.service
# /etc/systemd/system/example-foo.service
[Service]
ExecStart=/home/vagrant/script.sh
[Install]
WantedBy=multi-user.target

# /etc/systemd/system/example-bar.service
[Service]
ExecStart=/home/vagrant/script.sh
[Install]
WantedBy=multi-user.target

# /etc/systemd/system/example-baz.service
[Service]
ExecStart=/home/vagrant/script.sh
[Install]
WantedBy=multi-user.target

Maintenant, démarrons et activons les unités. Observez comment les liens symboliques sont créés.

$ sudo systemctl start example-{foo,bar,baz}.service
$ sudo systemctl enable example-{foo,bar,baz}.service
Created symlink from /etc/systemd/system/multi-user.target.wants/example-foo.service to /etc/systemd/system/example-foo.service.
Created symlink from /etc/systemd/system/multi-user.target.wants/example-bar.service to /etc/systemd/system/example-bar.service.
Created symlink from /etc/systemd/system/multi-user.target.wants/example-baz.service to /etc/systemd/system/example-baz.service.

Confirmez qu'il y a en fait 6 fichiers pour nos 3 unités.

$ find /etc/systemd/system -name 'example*.service'
/etc/systemd/system/multi-user.target.wants/example-bar.service
/etc/systemd/system/multi-user.target.wants/example-foo.service
/etc/systemd/system/multi-user.target.wants/example-baz.service
/etc/systemd/system/example-bar.service
/etc/systemd/system/example-foo.service
/etc/systemd/system/example-baz.service

Maintenant, vérifiez l'état des 3 unités, elles sont en marche.

$ systemctl list-units example*
UNIT                LOAD   ACTIVE SUB     DESCRIPTION
example-bar.service loaded active running example-bar.service
example-baz.service loaded active running example-baz.service
example-foo.service loaded active running example-foo.service

Maintenant, simulez un échec en envoyant un SIGKILL à example-foo.service . Observez comment l'unité est dans un état d'échec.

$ sudo systemctl kill -s KILL example-foo.service
$ systemctl list-units example*
  UNIT                LOAD   ACTIVE SUB     DESCRIPTION
  example-bar.service loaded active running example-bar.service
  example-baz.service loaded active running example-baz.service
 example-foo.service loaded failed failed  example-foo.service

Pour réinitialiser une unité en état d'échec, utilisez la fonction systemctl rese-failed commande. Observez comment l'unité est maintenant dans un état inactif.

$ sudo systemctl reset-failed
$ systemctl list-units example*
UNIT                LOAD   ACTIVE SUB     DESCRIPTION
example-bar.service loaded active running example-bar.service
example-baz.service loaded active running example-baz.service

...
$ systemctl list-units --all example*
UNIT                LOAD   ACTIVE   SUB     DESCRIPTION
example-bar.service loaded active   running example-bar.service
example-baz.service loaded active   running example-baz.service
example-foo.service loaded inactive dead    example-foo.service

Ok, maintenant supprimons l'unité example-bar.service. Observez comment l'unité est dans un état non trouvé ; cependant, le lien symbolique brisé de example-bar.service est toujours dans /etc/system/system/multi-user.target.wants.

$ sudo rm /etc/systemd/system/example-bar.service
$ sudo systemctl daemon-reload
$ sudo systemctl stop example-bar.service
Failed to stop example-bar.service: Unit example-bar.service not loaded.
$ systemctl list-units --all example*
  UNIT                LOAD      ACTIVE   SUB     DESCRIPTION
 example-bar.service not-found inactive dead    example-bar.service
  example-baz.service loaded    active   running example-baz.service
  example-foo.service loaded    inactive dead    example-foo.service
$ find /etc/systemd/system -name 'example*.service'
/etc/systemd/system/multi-user.target.wants/example-bar.service
/etc/systemd/system/multi-user.target.wants/example-foo.service
/etc/systemd/system/multi-user.target.wants/example-baz.service
/etc/systemd/system/example-foo.service
/etc/systemd/system/example-baz.service

Supprimez le lien symbolique cassé et confirmez que l'unité example-bar.service a disparu.

$ sudo rm /etc/systemd/system/multi-user.target.wants/example-bar.service
$ sudo systemctl daemon-reload
$ systemctl list-units --all example*
UNIT                LOAD   ACTIVE   SUB     DESCRIPTION
example-baz.service loaded active   running example-baz.service
example-foo.service loaded inactive dead    example-foo.service

0voto

Rolf Points 203

Il semble que systemd conserve les liens mais ne sait pas quoi en faire lorsque vous supprimez le fichier de l'unité.

Vous pouvez essayer de les supprimer manuellement dans /etc/systemd/system/suspend.target.wants/ et autres, mais bien sûr systemctl reset-failed d'une réponse précédente semble être une meilleure option.

$ cd /etc/systemd/system
$ sudo mv lock.service /tmp 
$ sudo systemctl disable lock.service
Failed to disable unit: No such file or directory
$ sudo mv /tmp/lock.service .
$ sudo systemctl disable lock.service
Removed /etc/systemd/system/suspend.target.wants/lock.service.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X