GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Generische Methodik zum Debuggen von Bestellzyklen in Systemd?

Ich kenne folgenden Thread und angeblich eine Antwort darauf. Nur ist eine Antwort keine Antwort im allgemeinen Sinne. Es sagt aus, was das Problem in einem bestimmten Fall war, aber nicht im Allgemeinen.

Meine Frage ist:Gibt es eine Möglichkeit, Bestellzyklen in einem Generikum zu debuggen? Weg? Beispiel:Gibt es einen Befehl, der den Zyklus beschreibt und was eine Einheit mit einer anderen verbindet?

Zum Beispiel habe ich folgendes in journalctl -b (Bitte ignorieren Sie das Datum, mein System hat keine RTC, mit der die Zeit synchronisiert werden kann):

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

wo cvol.service (der eingeführt wurde und der den Kreislauf durchbricht) ist:

[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

Laut Journalctl will cvol.service basic.service, außer dass es nicht so ist, zumindest nicht offensichtlich. Gibt es einen Befehl, der zeigt, woher dieser Link stammt? Und im Allgemeinen, gibt es einen Befehl, der die Zyklen findet und zeigt, wo jeder Link im Zyklus seinen Ursprung hat?

Akzeptierte Antwort:

Sie können den Zyklus mit den Befehlen systemd-analyze verify visualisieren , systemd-analyze dot und der GraphViz dot Werkzeug:

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

Sie sollten so etwas sehen:

Hier sehen Sie den Zyklus:c.service->b.service->a.service->c.service

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

Links:

  • systemd-analyze(1)
  • Punkt(1)
Verwandt:Php:gc_collect_cycles – Erzwingt die Sammlung aller vorhandenen Garbage-Zyklen
Linux
  1. Verwenden Sie systemd-Timer anstelle von Cronjobs

  2. 10 praktische systemd-Befehle:Eine Referenz

  3. So erstellen Sie einen Systemd-Dienst unter Linux

  4. Hinzufügen eines neuen Dienstes zu Linux systemd

  5. Linux – Wie stellt man die Standard-CPU-Affinität für alle Daemons in Systemd ein?

Systemd lieben lernen

Systemctl-Befehle zum Verwalten des Systemd-Dienstes

Verwalten von cgroups mit systemd

Linux – Wie debuggt man ein Suspend-to-ram-Problem unter Linux?

So löschen Sie Systemd-Journalprotokolle

SystemD - Wofür wird SystemD verwendet?