J'ai du mal à comprendre comment supprimer les unités systemd qui n'ont plus de fichiers. Ils semblent toujours s'attarder dans le système d'une manière ou d'une autre.
Les anciennes unités cassées que j'essaie de supprimer:
core@ip-172-16-32-83 ~ $ systemctl list-units --all firehose-router*
UNIT LOAD ACTIVE SUB DESCRIPTION
<E2><97><8F> [email protected] not-found failed failed [email protected]
<E2><97><8F> [email protected] not-found failed failed [email protected]
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, mais un rechargement a toujours ces unités en attente:
core@ip-172-16-32-83 ~ $ systemctl list-unit-files [email protected]
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> [email protected] not-found failed failed [email protected]
<E2><97><8F> [email protected] not-found failed failed [email protected]
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 aucun fichier qui leur soit lié 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?
La commande que vous recherchez est systemctl reset-failed
Lorsque systemd analyse les fichiers de définition d'unité, il prend note de toutes les autres unités associé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", ce n'est pas nécessairement une erreur - tout ce que nous savons, c'est qu'une définition d'unité locale prétend avoir une relation avec elle. Cette relation pourrait ne pas nous intéresser. Par exemple, il peut s'agir de "Before:"
une autre unité, mais nous n'utilisons pas cette autre unité.
failed
- se produit lorsqu'une unité est entrée dans un état d'échec et peut être réinitialisée avec le systemctl reset-failed
commandenot-found
- se produit lorsque vous avez supprimé une unité mais que systemd a toujours une référence, comme lorsqu'une unité est activée et qu'un lien symbolique est placé dans /etc/systemd/system
, cela peut être corrigé en supprimant les références à l'unité dans /etc/system/systemd/*.wants/
puis en cours d'exécution systemctl daemon-reload
Par exemple, supposez le script bash 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, commençons 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 bien 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 fonctionnent.
$ 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 en panne.
$ 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 panne, utilisez le 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
D'accord, supprimons maintenant l'unité example-bar.service. Observez comment l'unité est dans un état introuvable; cependant, le lien symbolique cassé example-bar.service se trouve 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 rompu 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
Il semble que systemd conserve les liens mais ne sait pas quoi en faire lorsque vous supprimez le fichier d'unité.
Vous pouvez essayer de les supprimer manuellement dans /etc/systemd/system/suspend.target.wants/
et tel mais bien sûr systemctl reset-failed
d'une réponse précédente sonne comme 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.