Je suis au courant du fil suivant et soi-disant une réponse . Sauf qu'une réponse n'est pas une réponse au sens générique. Il indique quel était le problème dans un cas particulier, mais pas en général.
Ma question est: existe-t-il un moyen de déboguer les cycles de commande de manière générique ? Par exemple: existe-t-il une commande qui décrira le cycle et qu'est-ce qui relie une unité à une autre?
Par exemple, je dois suivre journalctl -b
(veuillez ignorer la date, mon système n'a pas de RTC avec lequel synchroniser l'heure):
Jan 01 00:00:07 host0 systemd[1]: Found ordering cycle on sysinit.target/start
Jan 01 00:00:07 host0 systemd[1]: Found dependency on local-fs.target/start
Jan 01 00:00:07 host0 systemd[1]: Found dependency on cvol.service/start
Jan 01 00:00:07 host0 systemd[1]: Found dependency on basic.target/start
Jan 01 00:00:07 host0 systemd[1]: Found dependency on sockets.target/start
Jan 01 00:00:07 host0 systemd[1]: Found dependency on dbus.socket/start
Jan 01 00:00:07 host0 systemd[1]: Found dependency on sysinit.target/start
Jan 01 00:00:07 host0 systemd[1]: Breaking ordering cycle by deleting job local-fs.target/start
Jan 01 00:00:07 host0 systemd[1]: Job local-fs.target/start deleted to break ordering cycle starting with sysinit.target/start
où cvol.service (celui qui a été introduit et qui rompt le cycle) est:
[Unit]
Description=Mount Crypto Volume
After=boot.mount
Before=local-fs.target
[Service]
Type=oneshot
RemainAfterExit=no
ExecStart=/usr/bin/cryptsetup open /dev/*** cvol --key-file /boot/***
[Install]
WantedBy=home.mount
WantedBy=root.mount
WantedBy=usr-local.mount
Selon journalctl, cvol.service veut basic.service, sauf que ce n'est pas le cas, du moins pas évidemment. Existe-t-il une commande qui démontrerait d'où provient ce lien? Et en général, y a-t-il une commande, qui trouverait les cycles et montrerait l'origine de chaque lien dans le cycle?
systemd-analyze verify UNIT
pour vérifier l'exactitude de l'unité. Dans les coulisses, cette commande crée une instance de systemd virtuelle et essaie de charger UNIT donné comme transaction initiale (comme si c'était le casdefault.target
). Cela ne révélera aucune nouvelle information (par rapport aux journaux), mais au moins vous n'aurez pas à redémarrer avec l'unité activée pour voir si elle échoue.Vous pouvez visualiser le cycle avec les commandes
systemd-analyze verify
,systemd-analyze dot
et l' GraphVizdot
outil:Vous devriez voir quelque chose comme ceci:
Ici vous pouvez voir le cycle:
c.service->b.service->a.service->c.service
Liens:
la source
systemd-analyze verify
n'existe pas ici sur une installation debian 8.systemd-analyze verify
disponible depuisv216
. essayezsystemd-verify
. Existe-t-il?systemd-analyze verify default.target
à elle seule fait un travail décent en montrant la boucle ...étape 1: exécutez la commande de vérification pour default.target
étape 2: observez quel service ou cible mentionné dans le message "systemd Rupture du cycle de commande en supprimant le travail" et affichez sa liste complète des dépendances
étape 3: examinez les groupes "après" et "avant" à l'intérieur du fichier de service ou cible généralement défini dans
et trouver les services ou cibles bien connus pour être séquentiels mais qui sont dans l'ordre sortant pour celui-ci.
Exemple:
est généralement marché "après"
mais "avant"
une telle dépendance peut être facilement observée en appelant
cependant si le fichier
contenir des lignes comme:
ou
ou les deux simultanément, signifie que dbus.service est défini sortant et qu'il provoque un cycle sans fin systemd.
le remède est simple - changer le mot "après" en "avant" et vice-versa si nécessaire.
la source