GNU/Linux >> Tutoriels Linux >  >> Linux

Méthodologie générique pour déboguer les cycles de commande dans Systemd ?

Je suis au courant du fil suivant et soi-disant une réponse à celui-ci. 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 dans un générique chemin? Ex. :y a-t-il une commande qui va décrire le cycle et ce qui relie une unité à une autre ?

Par exemple, j'ai suivi dans journalctl -b (veuillez ne pas tenir compte de la date, mon système n'a pas de RTC pour 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 d'où vient chaque lien du cycle ?

Réponse acceptée :

Vous pouvez visualiser le cycle avec les commandes systemd-analyze verify , systemd-analyze dot et le dot de GraphViz outil :

systemd-analyze verify default.target |&
perl -lne 'print $1 if m{Found.*?ons+([^/]+)}' |
xargs --no-run-if-empty systemd-analyze dot |
dot -Tsvg >cycle.svg

Vous devriez voir quelque chose comme ceci :

Ici vous pouvez voir le cycle :c.service->b.service->a.service->c.service

Color legend: 
    black     = Requires
    dark blue = Requisite
    dark grey = Wants
    red       = Conflicts
    green     = After

Liens :

  • systemd-analyze(1)
  • point(1)
Connexe :Php :gc_collect_cycles — Force la collecte de tous les cycles de déchets existants
Linux
  1. Déboguer Linux avec ProcDump

  2. Utiliser des minuteries systemd au lieu de cronjobs

  3. Comment déboguer un script bash ?

  4. Comment déboguer le processus de démarrage systemd dans CentOS/RHEL 7 et 8

  5. Comment déboguer le processus de démarrage systemd dans CentOS/RHEL 7 et 8

Apprendre à aimer systemd

Commandes Systemctl pour gérer le service Systemd

10 commandes systemd pratiques :une référence

Gestion des cgroups avec systemd

Comment effacer les journaux de journal Systemd

SystemD - A quoi sert SystemD ?