Einführung
Ein Prozess ist ein laufendes Programm. Ein Dienst ist eine langfristig aktive Systemfunktion, die anhand einer Definition und festgelegter Lebenszyklusregeln verwaltet wird. Unter Ubuntu liest systemd die Unit-Definitionen ein, startet und beendet Dienste, überwacht deren Zustände und zeichnet ihre Ausgaben im Systemjournal auf.
In diesem Lab verwenden Sie den isolierten Übungsdienst labex-heartbeat. Sie untersuchen dessen Unit, steuern den Laufzeitzustand, konfigurieren die Aktivierung beim Systemstart, fragen Journal- und herkömmliche Textprotokolle ab, verfolgen laufende Ausgaben, diagnostizieren eine gezielt herbeigeführte Störung und stellen den ordnungsgemäßen Betrieb wieder her. Unit-Dateien bearbeiten Sie nicht, und der SSH-Dienst bleibt unberührt.
systemd und Service-Units erkennen
In diesem Schritt prüfen Sie, ob systemd verfügbar ist, und unterscheiden laufende Units von installierten Unit-Dateien.
Wechseln Sie in den Arbeitsbereich des Labs:
cd /home/labex/project/service-lab
Zeigen Sie die systemd-Version an. Zur Identifikation genügt die erste Zeile:
systemctl --version | head -n 1
Fragen Sie den Gesamtzustand von systemd ab:
systemctl is-system-running || true
running bedeutet, dass alle erforderlichen Units fehlerfrei arbeiten. Eine Schulungs-VM kann degraded melden, wenn eine davon unabhängige optionale Unit ausgefallen ist. Der Befehl zeigt dennoch, dass systemd reagiert.
Listen Sie eine Auswahl der derzeit laufenden Dienste auf:
systemctl list-units --type=service --state=running --no-pager | head -n 12
Eine Unit ist ein von systemd verwaltetes Objekt. Service-Units enden mit .service. Unit-Dateien beschreiben, was verwaltet werden kann, auch wenn es derzeit nicht läuft:
systemctl list-unit-files --type=service --no-pager | head -n 12
Speichern Sie eine kompakte Zusammenfassung von systemd. Die Befehlsersetzung $(...) fügt die Befehlsausgabe in den von printf geschriebenen Text ein:
printf 'systemd=%s\nstate=%s\n' "$(systemctl --version | head -n 1)" "$(systemctl is-system-running)" > systemd-summary.txt
cat systemd-summary.txt
Servicedefinition und Zustand untersuchen
In diesem Schritt untersuchen Sie den vorbereiteten Übungsdienst, bevor Sie ihn starten.
systemctl status kombiniert den Pfad der geladenen Unit, den Aktivierungsstatus, den Laufzeitzustand, Prozessinformationen und die neuesten Protokollzeilen:
cd /home/labex/project/service-lab
systemctl status labex-heartbeat.service --no-pager
Der Dienst sollte inactive (dead) und disabled sein. „Inaktiv“ bedeutet, dass er derzeit nicht läuft; „deaktiviert“ bedeutet, dass er über sein Installationsziel nicht für den Start beim Systemstart eingerichtet ist. Diese beiden Eigenschaften sind unabhängig voneinander.
Zeigen Sie die Unit-Definition an:
systemctl cat labex-heartbeat.service
Der Abschnitt [Unit] beschreibt Identität und Reihenfolge, [Service] definiert den Prozess und [Install] beschreibt die Aktivierung. Sie untersuchen lediglich diese vorbereitete Unit und müssen keine eigene erstellen.
Verwenden Sie systemctl show, um maschinenlesbare Eigenschaften abzurufen:
systemctl show labex-heartbeat.service -p LoadState -p ActiveState -p SubState -p UnitFileState
Speichern Sie diese Eigenschaften zur Überprüfung:
systemctl show labex-heartbeat.service -p LoadState -p ActiveState -p SubState -p UnitFileState > service-properties.txt
cat service-properties.txt
Einen Dienst starten, stoppen und neu starten
In diesem Schritt ändern Sie den Laufzeitzustand des Übungsdienstes und überprüfen jedes Ergebnis.
Zum Starten und Stoppen von Systemdiensten sind erhöhte Berechtigungen erforderlich. Starten Sie den Dienst:
sudo systemctl start labex-heartbeat.service
Prüfen Sie den kompakten Aktivzustand:
systemctl is-active labex-heartbeat.service
Die erwartete Ausgabe ist active. Zeigen Sie den ausführlicheren Status an:
systemctl status labex-heartbeat.service --no-pager
Der Status enthält nun eine Haupt-PID. Stoppen Sie den Dienst und untersuchen Sie das Ergebnis:
sudo systemctl stop labex-heartbeat.service
systemctl is-active labex-heartbeat.service || true
Der erwartete Zustand ist inactive. Starten Sie den Dienst erneut und verwenden Sie anschließend restart, um den laufenden Prozess in einem einzigen Vorgang zu ersetzen:
sudo systemctl start labex-heartbeat.service
sudo systemctl restart labex-heartbeat.service
systemctl show labex-heartbeat.service -p ActiveState -p SubState -p MainPID
Am Ende dieses Schritts sollte der Dienst ActiveState=active und SubState=running aufweisen.
Aktivierung beim Systemstart konfigurieren
In diesem Schritt unterscheiden Sie zwischen dem aktuellen Laufzeitzustand eines Dienstes und seiner Aktivierung für künftige Systemstarts.
Der Dienst ist nach dem vorherigen Schritt aktiv, seine Unit-Datei wurde bei der Einrichtung jedoch deaktiviert. Prüfen Sie den Aktivierungsstatus:
systemctl is-enabled labex-heartbeat.service || true
Aktivieren Sie den Dienst:
sudo systemctl enable labex-heartbeat.service
systemctl is-enabled labex-heartbeat.service
Durch die Aktivierung werden Verknüpfungen erstellt, die den Dienst mit einem Startziel verbinden. Ein bereits laufender Dienst muss dafür nicht neu gestartet werden.
Üben Sie nun das Entfernen dieser Startverknüpfungen:
sudo systemctl disable labex-heartbeat.service
systemctl is-enabled labex-heartbeat.service || true
Der Dienst kann weiterhin aktiv sein, obwohl die Ausgabe nun disabled lautet. Aktivieren Sie ihn für den abschließenden Zustand des Labs wieder:
sudo systemctl enable labex-heartbeat.service
Bestätigen Sie beide voneinander unabhängigen Eigenschaften:
systemctl is-active labex-heartbeat.service
systemctl is-enabled labex-heartbeat.service
Dienstprotokolle mit journalctl abfragen
In diesem Schritt lesen Sie die neuesten Ausgaben des Dienstes aus dem systemd-Journal und speichern eine gezielte Momentaufnahme.
Von systemd verwaltete Dienste senden ihre Standardausgabe und Standardfehlerausgabe normalerweise an das Journal. Fragen Sie ausschließlich die Übungs-Unit ab:
sudo journalctl -u labex-heartbeat.service -n 10 --no-pager
Die Option -u wählt eine Unit aus, -n 10 beschränkt die Ausgabe auf die zehn neuesten Einträge und --no-pager gibt sie direkt aus. Sie sollten die Startmeldung des Dienstes sowie Heartbeat-Einträge sehen.
Beschränken Sie die Ergebnisse auf ein aktuelles Zeitfenster:
sudo journalctl -u labex-heartbeat.service --since "5 minutes ago" --no-pager
Filtern Sie nach der Priorität „Warnung“ oder höher. Keine Ausgabe ist ein gesundes und gültiges Ergebnis, wenn der Dienst keine Warnung protokolliert hat:
sudo journalctl -u labex-heartbeat.service -p warning --since "5 minutes ago" --no-pager
Speichern Sie eine aktuelle, auf die Unit beschränkte Momentaufnahme im Projektarbeitsbereich:
cd /home/labex/project/service-lab
sudo journalctl -u labex-heartbeat.service -n 20 --no-pager > service-journal.txt
tail -n 5 service-journal.txt
Ein herkömmliches Textprotokoll verfolgen
In diesem Schritt untersuchen Sie /var/log und verfolgen ein Textprotokoll, während neue Einträge hinzukommen.
Die Hierarchie /var/log enthält zahlreiche herkömmliche System- und Anwendungsprotokolle. Listen Sie eine kleine Auswahl auf:
ls -lh /var/log | head -n 12
Lesen Sie die neuesten Einträge des Übungsdienstes:
tail -n 5 /var/log/labex-heartbeat.log
Die Option -f verfolgt eine Datei und zeigt neue Zeilen an, sobald ein anderer Prozess sie anhängt:
tail -f /var/log/labex-heartbeat.log
Warten Sie, bis mindestens zwei neue Heartbeat-Zeilen angezeigt werden, und drücken Sie dann Ctrl+C. Dadurch wird tail unterbrochen, nicht jedoch der Dienst, der das Protokoll schreibt.
Filtern Sie die Heartbeat-Zeilen und zeigen Sie die drei neuesten an:
grep '^heartbeat ' /var/log/labex-heartbeat.log | tail -n 3
Speichern Sie eine Auswahl von fünf Zeilen im Projektarbeitsbereich:
cd /home/labex/project/service-lab
tail -n 5 /var/log/labex-heartbeat.log > traditional-log-sample.txt
cat traditional-log-sample.txt
Einen ausgefallenen Dienst diagnostizieren und wiederherstellen
In diesem Schritt erzeugen Sie gezielt einen Konfigurationsfehler, identifizieren ihn anhand des Dienstzustands und der Protokolle und stellen den ordnungsgemäßen Betrieb wieder her.
Stoppen Sie den Übungsdienst und sichern Sie seine einfache Konfiguration:
sudo systemctl stop labex-heartbeat.service
sudo cp /etc/labex-heartbeat.conf /etc/labex-heartbeat.conf.bak
Ersetzen Sie das numerische Intervall durch einen ungültigen Wert. Dadurch wird absichtlich nur der Übungsdienst beeinträchtigt:
sudo sed -i 's/^INTERVAL=2$/INTERVAL=invalid/' /etc/labex-heartbeat.conf
Versuchen Sie, den Dienst zu starten. Eine Fehlermeldung wird erwartet:
sudo systemctl start labex-heartbeat.service || true
Untersuchen Sie den fehlgeschlagenen Zustand:
systemctl status labex-heartbeat.service --no-pager || true
systemctl is-failed labex-heartbeat.service
Der Status zeigt, dass der Prozess beendet wurde. Das Journal liefert jedoch den anwendungsspezifischen Grund:
sudo journalctl -u labex-heartbeat.service -n 10 --no-pager
Suchen Sie nach configuration error: INTERVAL must be a positive integer. Stellen Sie die funktionierende Konfiguration wieder her, setzen Sie den aufgezeichneten Fehlerzustand zurück und starten Sie den Dienst erneut:
sudo mv /etc/labex-heartbeat.conf.bak /etc/labex-heartbeat.conf
sudo systemctl reset-failed labex-heartbeat.service
sudo systemctl start labex-heartbeat.service
Bestätigen Sie die Wiederherstellung:
systemctl is-active labex-heartbeat.service
cat /etc/labex-heartbeat.conf
Der Dienst sollte active sein, und die Konfiguration sollte wieder INTERVAL=2 enthalten.
Zusammenfassung
Sie haben Prozesse, Dienste, den Aktivzustand und die Aktivierung beim Systemstart unterschieden. Sie haben eine systemd-Unit untersucht, einen sicheren Übungsdienst mit systemctl gesteuert und seine Einträge mit journalctl abgefragt.
Außerdem haben Sie /var/log untersucht, laufende Textausgaben mit tail -f verfolgt, anhand von Status und Protokollen gemeinsam eine kontrollierte Störung erklärt und den Dienst wiederhergestellt. Dieser Ansatz – zuerst den Zustand prüfen, anschließend die Protokolle auswerten – bildet eine praktische Grundlage für die Fehlersuche bei Diensten.



