Einführung
In diesem Lab sammeln Sie praktische Erfahrungen im Management von Systemdiensten unter RHEL mit dem Befehl systemctl. Sie lernen, alle geladenen und aktiven Dienste anzuzeigen, den Status spezifischer Dienste zu überprüfen und deren Laufzeitverhalten durch Starten, Stoppen und Neustarten zu steuern. Darüber hinaus erfahren Sie, wie Sie Dienstkonfigurationen neu laden, Dienste für den automatischen Start beim Booten aktivieren oder deaktivieren und verstehen die fortgeschrittenen Konzepte des Maskierens und Entmaskierens von Diensten, um deren Aktivierung zu verhindern.
Diese praktische Anleitung vermittelt Ihnen wesentliche Fähigkeiten für die Systemadministration, die es Ihnen ermöglichen, den Lebenszyklus von Diensten, die für den Betrieb Ihres RHEL-Systems entscheidend sind, effektiv zu überwachen und zu verwalten.
Alle geladenen und aktiven Dienste mit systemctl anzeigen
In diesem Schritt lernen Sie, wie Sie automatisch gestartete Systemprozesse mit dem Befehl systemctl identifizieren. systemctl ist das primäre Werkzeug zur Verwaltung von systemd-Diensten in Red Hat Enterprise Linux.
Zuerst untersuchen wir, wie alle aktuell geladenen und aktiven Service-Units aufgelistet werden. Der Befehl systemctl list-units --type=service wird zu diesem Zweck verwendet. Dieser Befehl zeigt Service-Units an, die der systemd-Daemon erfolgreich geparst und in den Speicher geladen hat und die derzeit aktiv sind.
Öffnen Sie Ihr Terminal in der RHEL-Umgebung. Sie sind bereits als Benutzer labex angemeldet und Ihr aktuelles Verzeichnis ist ~/project.
Führen Sie den folgenden Befehl aus, um alle geladenen und aktiven Service-Units aufzulisten:
systemctl list-units --type=service
Sie sehen eine Ausgabe ähnlich dieser, die verschiedene Dienste und ihre Zustände anzeigt:
UNIT LOAD ACTIVE SUB DESCRIPTION
atd.service loaded active running Job spooling tools
auditd.service loaded active running Security Auditing Service
chronyd.service loaded active running NTP client/server
crond.service loaded active running Command Scheduler
dbus-broker.service loaded active running D-Bus System Message Bus
...output omitted...
Lassen Sie uns die Spalten in der Ausgabe aufschlüsseln:
- UNIT: Dies ist der Name der Service-Unit, der normalerweise mit
.serviceendet. - LOAD: Zeigt an, ob der
systemd-Daemon die Konfiguration der Unit erfolgreich geparst und in den Speicher geladen hat.loadedbedeutet, dass dies erfolgreich war. - ACTIVE: Dies ist der übergeordnete Aktivierungszustand der Unit.
activebedeutet im Allgemeinen, dass die Unit erfolgreich gestartet wurde. - SUB: Dies ist der untergeordnete Aktivierungszustand, der detailliertere Informationen liefert. Bei laufenden Diensten ist
runningüblich. - DESCRIPTION: Eine kurze Beschreibung dessen, was der Dienst tut.
Drücken Sie q, um den Befehl zu beenden.
Als Nächstes können Sie die Option --all mit systemctl list-units --type=service verwenden, um alle Service-Units unabhängig von ihrem Aktivierungszustand (aktiv, inaktiv, fehlgeschlagen usw.) aufzulisten. Dies kann nützlich sein, um Dienste zu sehen, die installiert, aber derzeit nicht ausgeführt werden.
Führen Sie den folgenden Befehl aus:
systemctl list-units --type=service --all
Die Ausgabe enthält Dienste, die inactive oder in anderen Zuständen sind, und bietet eine umfassendere Ansicht:
UNIT LOAD ACTIVE SUB DESCRIPTION
atd.service loaded active running Job spooling tools
auditd.service loaded active running Security Auditing ...
auth-rpcgss-module.service loaded inactive dead Kernel Module ...
chronyd.service loaded active running NTP client/server
cpupower.service loaded inactive dead Configure CPU power ...
crond.service loaded active running Command Scheduler
dbus-broker.service loaded active running D-Bus System Message Bus
● display-manager.service not-found inactive dead display-manager.service
...output omitted...
Schließlich können Sie mit systemctl list-unit-files --type=service den Zustand aller installierten Unit-Dateien anzeigen, einschließlich derer, die nicht geladen oder aktiv sind. Dieser Befehl zeigt an, ob ein Dienst enabled (wird beim Booten gestartet), disabled (wird nicht beim Booten gestartet), static (kann nicht direkt aktiviert werden, wird aber möglicherweise von einer anderen Unit gestartet) oder masked (kann nicht gestartet werden) ist.
Führen Sie den folgenden Befehl aus:
systemctl list-unit-files --type=service
Sie sehen eine Ausgabe ähnlich dieser, die den STATE und VENDOR PRESET für jede Service-Unit-Datei angibt:
UNIT FILE STATE VENDOR PRESET
arp-ethers.service disabled disabled
atd.service enabled enabled
auditd.service enabled enabled
auth-rpcgss-module.service static -
autovt@.service alias -
blk-availability.service disabled disabled
...output omitted...
Dieser Befehl ist besonders nützlich, um zu verstehen, welche Dienste so konfiguriert sind, dass sie beim Systemstart automatisch gestartet werden.
Status eines bestimmten Dienstes mit systemctl status prüfen
In diesem Schritt lernen Sie, wie Sie den detaillierten Status eines bestimmten Dienstes mit dem Befehl systemctl status überprüfen. Dieser Befehl liefert umfassende Informationen über einen Dienst, einschließlich ob er läuft, seine Prozess-ID, Speichernutzung und aktuelle Protokolleinträge.
Wir verwenden crond.service (cron-Daemon) als Beispiel. Der Cron-Daemon ist ein gängiger Dienst, der geplante Aufgaben verwaltet.
Öffnen Sie Ihr Terminal in der RHEL-Umgebung. Stellen Sie sicher, dass Sie sich in Ihrem Verzeichnis ~/project befinden.
Führen Sie den folgenden Befehl aus, um den Status von crond.service zu überprüfen:
systemctl status crond.service
Sie sehen eine detaillierte Ausgabe ähnlich dieser:
● crond.service - Command Scheduler
Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; preset: enabled)
Active: active (running) since Mon 2022-03-14 05:38:10 EDT; 25min ago
Main PID: 1089 (crond)
Tasks: 1 (limit: 35578)
Memory: 1.2M
CPU: 12ms
CGroup: /system.slice/crond.service
└─1089 /usr/sbin/crond -n
Mar 14 05:38:10 workstation systemd[1]: Started Command Scheduler.
Warning: some journal files were not opened due to insufficient permissions.
Lassen Sie uns die wichtigsten Felder in der Ausgabe untersuchen:
Loaded: Diese Zeile gibt an, ob die Konfigurationsdatei der Service-Unit verarbeitet wurde. Sie zeigt auch den Pfad zur Unit-Datei (/usr/lib/systemd/system/crond.service) und ihren Aktivierungsstatus (enabledbedeutet, dass sie für den Start beim Booten konfiguriert ist).Active: Dies ist entscheidend. Es zeigt den aktuellen Zustand des Dienstes an.active (running)bedeutet, dass der Dienst derzeit aktiv ist und seine Prozesse laufen. Es zeigt auch an, wie lange er bereits aktiv ist. Andere Zustände könneninactive(nicht laufend),active (exited)(eine einmalige Aufgabe abgeschlossen) oderfailed(ein Fehler ist aufgetreten) sein.Main PID: Die Prozess-ID (PID) des Hauptprozesses, der mit dem Dienst verbunden ist, zusammen mit dem Befehlsnamen.Tasks: Die Anzahl der Aufgaben (Threads), die der Dienst derzeit verwendet.Memory: Die vom Dienst verbrauchte Speichermenge.CPU: Die vom Dienst verbrauchte CPU-Zeit.CGroup: Informationen über die Control Group (CGroup), zu der der Dienst gehört und die für die Ressourcenverwaltung verwendet wird.- Die Zeilen unter
CGroupzeigen aktuelle Protokolleinträge, die sich auf den Dienst beziehen und Einblicke in seinen Start und seine laufenden Aktivitäten geben.
Zusätzlich zu systemctl status gibt es einfachere Befehle, um schnell bestimmte Aspekte des Dienststatus zu überprüfen:
Um zu überprüfen, ob ein Dienst aktiv ist:
systemctl is-active crond.serviceErwartete Ausgabe:
activeUm zu überprüfen, ob ein Dienst aktiviert ist (konfiguriert für den Start beim Booten):
systemctl is-enabled crond.serviceErwartete Ausgabe:
enabledUm zu überprüfen, ob ein Dienst fehlgeschlagen ist:
systemctl is-failed crond.serviceErwartete Ausgabe (wenn er korrekt läuft):
activeWenn ein Dienst Probleme beim Starten oder Ausführen hatte, würde dieser Befehl
failedzurückgeben.
Diese Befehle sind nützlich für Skripte oder schnelle Überprüfungen, wenn Sie nicht die vollständige detaillierte Ausgabe von systemctl status benötigen.
Dienst mit systemctl starten, stoppen und neu starten
In diesem Schritt lernen Sie, wie Sie den Lebenszyklus von Systemdiensten mit systemctl-Befehlen verwalten. Sie werden das Starten, Stoppen und Neustarten eines Dienstes üben. Für diese Übung erstellen wir einen Dummy-Dienst. Dieser Ansatz stellt sicher, dass wir einen Dienst sicher manipulieren können, ohne kritische Systemfunktionen zu beeinträchtigen.
Zuerst erstellen wir eine einfache Service-Unit-Datei. Diese Datei definiert einen Dienst, der alle paar Sekunden einfach einen Zeitstempel in eine Protokolldatei schreibt.
Erstellen Sie eine neue Service-Unit-Datei namens mytest.service direkt im systemd-Systemverzeichnis mit nano:
sudo nano /etc/systemd/system/mytest.service
Fügen Sie den folgenden Inhalt in den nano-Editor ein:
[Unit]
Description=My Test Service
After=network.target
[Service]
Type=simple
ExecStart=/bin/bash -c 'while true; do echo "$(date): My Test Service is running." >> /tmp/mytest.log; sleep 5; done'
ExecStop=/bin/bash -c 'echo "$(date): My Test Service stopped." >> /tmp/mytest.log'
Restart=on-failure
[Install]
WantedBy=multi-user.target
[Unit]: Enthält allgemeine Informationen über die Unit.Descriptionliefert einen menschenlesbaren Namen, undAfter=network.targetgibt an, dass dieser Dienst nach dem Hochfahren des Netzwerks gestartet werden soll.[Service]: Definiert das Verhalten des Dienstes.Type=simple: Zeigt einen einfachen Diensttyp an, bei dem derExecStart-Befehl der Hauptprozess ist.ExecStart: Der Befehl, der ausgeführt wird, wenn der Dienst gestartet wird. Hierbei handelt es sich um eine Bash-Schleife, die alle 5 Sekunden eine zeitgestempelte Nachricht in/tmp/mytest.logschreibt.ExecStop: Der Befehl, der ausgeführt wird, wenn der Dienst gestoppt wird. Er schreibt eine Stopp-Nachricht in das Protokoll.Restart=on-failure: Konfiguriert den Dienst so, dass er neu gestartet wird, wenn er mit einem Status ungleich Null beendet wird.
[Install]: Enthält Informationen darüber, wie der Dienst installiert werden soll.WantedBy=multi-user.targetbedeutet, dass dieser Dienst gestartet werden soll, wenn das System den Multi-User-Runlevel erreicht.
Speichern Sie die Datei, indem Sie Ctrl+X drücken, dann Y zur Bestätigung und Enter, um die Datei zu speichern.
Laden Sie nun den systemd-Daemon neu, damit er den neuen Dienst erkennt:
sudo systemctl daemon-reload
Dienst starten
Um einen Dienst zu starten, verwenden Sie den Befehl systemctl start.
Führen Sie den folgenden Befehl aus, um mytest.service zu starten. Beachten Sie, dass wir sudo verwenden müssen, da systemctl-Operationen in der Regel Root-Privilegien erfordern.
sudo systemctl start mytest.service
Wenn der Befehl erfolgreich war, gibt es keine sofortige Ausgabe.
Überprüfen Sie nun, ob der Dienst läuft, indem Sie seinen Status abfragen:
systemctl status mytest.service
Sie sollten eine Ausgabe sehen, die anzeigt, dass der Dienst active (running) ist:
● mytest.service - My Test Service
Loaded: loaded (/etc/systemd/system/mytest.service; disabled; preset: disabled)
Active: active (running) since ...
Main PID: ... (bash)
Tasks: 2 (limit: ...)
Memory: ...
CPU: ...
CGroup: /system.slice/mytest.service
├─... /bin/bash -c "while true; do echo \"\$(date): My Test Service is running.\" >> /tmp/mytest.log; sleep 5; done"
└─... sleep 5
...output omitted...
Sie können auch die Protokolldatei überprüfen, um zu sehen, ob der Dienst Nachrichten schreibt:
tail -f /tmp/mytest.log
Sie sollten alle 5 Sekunden neue Zeilen sehen, ähnlich wie diese:
Tue Jul 22 09:15:09 AM CST 2025: My Test Service is running.
Tue Jul 22 09:15:14 AM CST 2025: My Test Service is running.
Drücken Sie Ctrl+C, um tail zu beenden.
Dienst stoppen
Um einen laufenden Dienst zu stoppen, verwenden Sie den Befehl systemctl stop.
Führen Sie den folgenden Befehl aus, um mytest.service zu stoppen:
sudo systemctl stop mytest.service
Auch hier gibt es keine sofortige Ausgabe.
Überprüfen Sie, ob der Dienst gestoppt wurde:
systemctl status mytest.service
Die Ausgabe sollte nun Active: inactive (dead) anzeigen:
○ mytest.service - My Test Service
Loaded: loaded (/etc/systemd/system/mytest.service; disabled; preset: disabled)
Active: inactive (dead) since ...
...output omitted...
Überprüfen Sie die Protokolldatei /tmp/mytest.log erneut. Sie sollten die Meldung "My Test Service stopped." sehen und keine neuen "running"-Meldungen mehr erscheinen.
tail /tmp/mytest.log
Die Ausgabe wird ähnlich wie folgt aussehen:
Tue Jul 22 09:15:24 AM CST 2025: My Test Service is running.
Tue Jul 22 09:15:28 AM CST 2025: My Test Service stopped.
Dienst neu starten
Um einen Dienst neu zu starten, verwenden Sie den Befehl systemctl restart. Dieser Befehl stoppt zuerst den Dienst und startet ihn dann erneut. Dies ist nützlich, wenn Sie Änderungen an der Konfiguration eines Dienstes vorgenommen haben und diese wirksam werden müssen.
Führen Sie den folgenden Befehl aus, um mytest.service neu zu starten:
sudo systemctl restart mytest.service
Überprüfen Sie, ob der Dienst wieder läuft:
systemctl status mytest.service
Sie sollten wieder Active: active (running) sehen, und die Main PID wird wahrscheinlich eine neue Nummer sein, was darauf hinweist, dass ein neuer Prozess gestartet wurde.
● mytest.service - My Test Service
Loaded: loaded (/etc/systemd/system/mytest.service; disabled; preset: disabled)
Active: active (running) since ...
Main PID: ... (bash)
Tasks: 2 (limit: ...)
Memory: ...
CPU: ...
CGroup: /system.slice/mytest.service
├─... /bin/bash -c "while true; do echo \"\$(date): My Test Service is running.\" >> /tmp/mytest.log; sleep 5; done"
└─... sleep 5
...output omitted...
Überprüfen Sie die Protokolldatei /tmp/mytest.log, um sicherzustellen, dass der Dienst mit dem Schreiben von "running"-Meldungen fortgefahren ist.
tail -f /tmp/mytest.log
Sie sollten eine "stopped"-Meldung gefolgt von neuen "running"-Meldungen sehen:
Tue Jul 22 09:15:28 AM CST 2025: My Test Service stopped.
Tue Jul 22 09:15:40 AM CST 2025: My Test Service is running.
Drücken Sie Ctrl+C, um tail zu beenden.
Anwenden von Konfigurationsänderungen auf einen Dienst
In diesem Schritt lernen Sie das Neuladen von Dienstkonfigurationen kennen. Einige Dienste können Änderungen an ihren Konfigurationsdateien anwenden, ohne einen vollständigen Neustart zu benötigen. Dies wird als "Neuladen" (reloading) des Dienstes bezeichnet. Das Neuladen wird im Allgemeinen dem Neustarten vorgezogen, da es Ausfallzeiten des Dienstes vermeidet und bestehende Verbindungen oder Zustände beibehält. Wenn ein Dienst neu geladen wird, bleibt seine Prozess-ID (PID) typischerweise gleich, im Gegensatz zu einem vollständigen Neustart, bei dem sich die PID ändert.
Wir werden unseren mytest.service aus dem vorherigen Schritt weiter verwenden. Wir werden sein Verhalten ändern und dann versuchen, es neu zu laden, um zu sehen, was passiert.
Stellen Sie zunächst sicher, dass mytest.service läuft. Wenn nicht, starten Sie ihn:
sudo systemctl start mytest.service
Überprüfen Sie seinen Status und notieren Sie sich seine Main PID:
systemctl status mytest.service
Nun ändern wir die Datei mytest.service, um die Nachricht, die sie protokolliert, und das Intervall zu ändern. Wir ändern die Protokollnachricht und die sleep-Dauer.
Öffnen Sie /etc/systemd/system/mytest.service mit nano:
sudo nano /etc/systemd/system/mytest.service
Ändern Sie die Zeile ExecStart wie folgt, indem Sie die Nachricht und die sleep-Zeit von 5 auf 2 Sekunden ändern:
[Unit]
Description=My Test Service
After=network.target
[Service]
Type=simple
ExecStart=/bin/bash -c 'while true; do echo "$(date): My Test Service (reloaded) is running." >> /tmp/mytest.log; sleep 2; done'
ExecStop=/bin/bash -c 'echo "$(date): My Test Service stopped." >> /tmp/mytest.log'
Restart=on-failure
[Install]
WantedBy=multi-user.target
Speichern Sie die Datei, indem Sie Ctrl+X, dann Y und Enter drücken.
Nachdem Sie die Änderungen gespeichert haben, müssen Sie systemd informieren, dass sich die Konfiguration des Dienstes geändert hat.
sudo systemctl daemon-reload
Versuchen wir nun, den Dienst neu zu laden, um die Änderungen anzuwenden:
sudo systemctl reload mytest.service
Sie werden wahrscheinlich auf einen Fehler stoßen:
Failed to reload mytest.service: Job type reload is not applicable for unit mytest.service.
Dieser Fehler tritt auf, weil unser einfacher Dienst nicht dafür konfiguriert ist, eine Neuladeanforderung zu verarbeiten. Damit ein Dienst neu geladen werden kann, muss seine Unit-Datei eine ExecReload-Direktive enthalten, die den Befehl angibt, der zum Neuladen der Konfiguration ausgeführt werden soll. Da unser mytest.service diese nicht hat, weiß systemd nicht, wie es ihn neu laden soll.
In solchen Situationen bietet systemd einen praktischen Befehl: reload-or-restart. Dieser Befehl versucht, den Dienst neu zu laden, aber wenn das Neuladen nicht unterstützt wird, greift er auf einen Neustart des Dienstes zurück. Dies ist oft eine sicherere und effektivere Methode, um Konfigurationsänderungen anzuwenden.
Verwenden wir nun reload-or-restart:
sudo systemctl reload-or-restart mytest.service
Dieser Befehl sollte erfolgreich sein. Überprüfen Sie nun erneut den Status des Dienstes:
systemctl status mytest.service
Beachten Sie die Main PID. Da unser Dienst neu gestartet wurde (weil er nicht neu geladen werden konnte), werden Sie feststellen, dass die Main PID eine neue Nummer ist. Dies bestätigt, dass der alte Prozess gestoppt und ein neuer mit der aktualisierten Konfiguration gestartet wurde.
Schließlich überprüfen wir die Datei /tmp/mytest.log, um zu sehen, ob die Änderungen wirksam geworden sind.
tail -f /tmp/mytest.log
Sie sollten die neue Protokollnachricht "My Test Service (reloaded) is running." sehen, die alle 2 Sekunden erscheint. Drücken Sie Ctrl+C, um tail zu beenden.
Dienste beim Booten mit systemctl aktivieren und deaktivieren
In diesem Schritt lernen Sie, wie Sie Dienste so konfigurieren, dass sie beim Systemstart automatisch gestartet werden (aktivieren) oder verhindern, dass sie beim Systemstart gestartet werden (deaktivieren). Dies ist entscheidend für die Verwaltung von Systemressourcen und stellt sicher, dass notwendige Dienste beim Systemstart verfügbar sind.
In einer typischen systemd-Umgebung erstellt das Aktivieren eines Dienstes symbolische Links in den entsprechenden systemd-Konfigurationsverzeichnissen (z. B. /etc/systemd/system/multi-user.target.wants/), die auf die Unit-Datei des Dienstes verweisen. Das Deaktivieren eines Dienstes entfernt diese Links.
Da wir uns in einer containerisierten Umgebung befinden, in der systemd möglicherweise nicht im herkömmlichen Sinne voll funktionsfähig ist, erstellen die Befehle enable und disable möglicherweise keine tatsächlichen symbolischen Links im Verzeichnis /etc/systemd/system, die über Container-Neustarts hinweg bestehen bleiben. systemctl verarbeitet diese Befehle jedoch weiterhin und aktualisiert seinen internen Zustand, was wir beobachten werden.
Wir werden für diese Demonstration weiterhin unseren mytest.service verwenden.
Stellen Sie zunächst sicher, dass mytest.service aus dem vorherigen Schritt gestoppt ist:
sudo systemctl stop mytest.service
Dienst aktivieren
Um einen Dienst zu aktivieren, verwenden Sie den Befehl systemctl enable. Dieser Befehl konfiguriert den Dienst so, dass er beim Systemstart automatisch gestartet wird.
Führen Sie den folgenden Befehl aus, um mytest.service zu aktivieren:
sudo systemctl enable mytest.service
Sie sehen möglicherweise eine Ausgabe, die der folgenden ähnelt und anzeigt, dass in einer vollständigen systemd-Umgebung ein symbolischer Link erstellt würde:
Created symlink /etc/systemd/system/multi-user.target.wants/mytest.service → /etc/systemd/system/mytest.service.
Überprüfen Sie nun mit systemctl is-enabled, ob der Dienst aktiviert ist:
systemctl is-enabled mytest.service
Erwartete Ausgabe:
enabled
Dies bestätigt, dass systemctl mytest.service nun als für den Systemstart aktiviert betrachtet.
Sie können das Aktivieren und Starten eines Dienstes auch mit einer einzigen Befehlszeile mit der Option --now kombinieren. Dies ist eine praktische Möglichkeit, sicherzustellen, dass ein Dienst sofort läuft und für den Start bei zukünftigen Systemstarts konfiguriert ist.
Deaktivieren wir ihn zunächst, um uns auf die --now-Demonstration vorzubereiten:
sudo systemctl disable mytest.service
Aktivieren und starten Sie ihn nun gleichzeitig:
sudo systemctl enable --now mytest.service
Überprüfen Sie seinen Status und seine Aktivierung:
systemctl status mytest.service
systemctl is-enabled mytest.service
Sie sollten vom status-Befehl Active: active (running) und vom is-enabled-Befehl enabled sehen.
Dienst deaktivieren
Um einen Dienst zu deaktivieren, verwenden Sie den Befehl systemctl disable. Dieser Befehl entfernt die Konfiguration, die dazu führt, dass der Dienst beim Systemstart gestartet wird.
Führen Sie den folgenden Befehl aus, um mytest.service zu deaktivieren:
sudo systemctl disable mytest.service
Sie sehen möglicherweise eine Ausgabe, die die Entfernung des symbolischen Links anzeigt:
Removed /etc/systemd/system/multi-user.target.wants/mytest.service.
Überprüfen Sie nun, ob der Dienst deaktiviert ist:
systemctl is-enabled mytest.service
Erwartete Ausgabe:
disabled
Ähnlich wie beim Aktivieren können Sie das Deaktivieren und Stoppen eines Dienstes mit der Option --now kombinieren. Dies stoppt den Dienst sofort und verhindert, dass er bei zukünftigen Systemstarts gestartet wird.
sudo systemctl disable --now mytest.service
Überprüfen Sie seinen Status und seine Aktivierung:
systemctl status mytest.service
systemctl is-enabled mytest.service
Sie sollten vom status-Befehl Active: inactive (dead) und vom is-enabled-Befehl disabled sehen.
Damit ist die Demonstration des Aktivierens und Deaktivierens von Diensten abgeschlossen. Denken Sie daran, dass diese Befehle in einer realen systemd-Umgebung direkt die Boot-Konfiguration manipulieren.
Dienste mit systemctl maskieren und entmaskieren
In diesem letzten Schritt lernen Sie das Maskieren und Entmaskieren von Diensten kennen. Das Maskieren eines Dienstes ist eine leistungsstarke Methode, um zu verhindern, dass er manuell oder automatisch beim Systemstart gestartet wird.
Wenn Sie einen Dienst maskieren, erstellt systemd einen symbolischen Link von /etc/systemd/system/<service-name>.service nach /dev/null, wodurch die Unit-Datei des Dienstes für systemd effektiv unzugänglich gemacht wird. Dies ist eine stärkere Alternative zu disable.
Dieser Mechanismus funktioniert am besten für Dienste, die in /usr/lib/systemd/system definiert sind, wo Pakete ihre Service-Dateien installieren. Der Befehl mask erstellt eine überschreibende "leere" Datei in /etc/systemd/system. Wie Sie jedoch festgestellt haben, kann der Befehl fehlschlagen, wenn Sie versuchen, einen Dienst zu maskieren, den Sie direkt in /etc/systemd/system erstellt haben (wie unseren mytest.service), da er so konzipiert ist, dass er keine vorhandene Konfigurationsdatei überschreibt, was zu Datenverlust führen würde.
Um das Maskieren korrekt zu demonstrieren, verwenden wir einen bereits vorhandenen Dienst, atd.service.
Überprüfen wir zunächst den aktuellen Status von atd.service. Er sollte aktiv und aktiviert sein.
systemctl status atd.service
Die Ausgabe wird ähnlich wie folgt aussehen und zeigen, dass der Dienst aktiv und läuft:
● atd.service - Deferred execution scheduler
Loaded: loaded (/usr/lib/systemd/system/atd.service; enabled; preset: enabled)
Active: active (running) since Tue 2025-07-22 09:13:06 CST; 22min ago
Docs: man:atd(8)
Main PID: 1222 (atd)
Tasks: 1 (limit: 22509)
Memory: 900.0K
CPU: 5ms
CGroup: /system.slice/atd.service
└─1222 /usr/sbin/atd -f
Dienst maskieren
Es ist eine gute Praxis, einen Dienst zu stoppen, bevor er maskiert wird.
sudo systemctl stop atd.service
Führen Sie nun den folgenden Befehl aus, um atd.service zu maskieren:
sudo systemctl mask atd.service
Sie sehen eine Ausgabe, die die Erstellung eines symbolischen Links nach /dev/null anzeigt:
Created symlink /etc/systemd/system/atd.service → /dev/null.
Versuchen Sie nun, den maskierten Dienst zu starten:
sudo systemctl start atd.service
Sie erhalten eine Fehlermeldung, die darauf hinweist, dass der Dienst maskiert ist:
Failed to start atd.service: Unit atd.service is masked.
Sie können den Status des Dienstes auch mit systemctl list-unit-files überprüfen:
systemctl list-unit-files --type=service | grep atd.service
Die Ausgabe sollte für atd.service masked anzeigen:
atd.service masked enabled
Dies bestätigt, dass der Dienst nun maskiert ist und nicht gestartet werden kann.
Dienst entmaskieren
Um einen Dienst zu entmaskieren, verwenden Sie den Befehl systemctl unmask. Dieser Befehl entfernt den symbolischen Link nach /dev/null und stellt die ursprüngliche Service-Datei aus /usr/lib/systemd/system wieder her.
Führen Sie den folgenden Befehl aus, um atd.service zu entmaskieren:
sudo systemctl unmask atd.service
Sie sehen eine Ausgabe, die die Entfernung des symbolischen Links anzeigt:
Removed "/etc/systemd/system/atd.service".
Überprüfen Sie nun erneut den Status des Dienstes mit systemctl list-unit-files:
systemctl status atd.service
Sie sollten Active: active (running) sehen, ähnlich wie hier:
● atd.service - Deferred execution scheduler
Loaded: loaded (/usr/lib/systemd/system/atd.service; enabled; preset: enabled)
Active: active (running) since Tue 2025-07-22 09:36:10 CST; 2s ago
Docs: man:atd(8)
Main PID: 7372 (atd)
Tasks: 1 (limit: 22509)
Memory: 868.0K
CPU: 6ms
CGroup: /system.slice/atd.service
└─7372 /usr/sbin/atd -f
Damit ist das Lab zur Steuerung von Diensten und Daemons abgeschlossen. Sie haben gelernt, wie Sie Dienste mit systemctl anzeigen, starten, stoppen, neu starten, neu laden, aktivieren, deaktivieren, maskieren und entmaskieren.
Zusammenfassung
In diesem Lab haben wir praktische Erfahrungen mit der Verwaltung von Systemdiensten mithilfe des Befehls systemctl gesammelt, selbst in einer containerisierten Umgebung, in der systemd möglicherweise nicht das primäre Init-System ist. Wir haben gelernt, wie alle geladenen und aktiven Service-Units mit systemctl list-units --type=service aufgelistet werden, und die Spalten UNIT, LOAD, ACTIVE und SUB verstanden, um den Status von Diensten zu interpretieren.
Darüber hinaus haben wir wesentliche Service-Management-Operationen untersucht: den Status eines bestimmten Dienstes mit systemctl status zu überprüfen und den Lebenszyklus von Diensten durch Starten, Stoppen und Neustarten zu steuern. Wir haben auch behandelt, wie Service-Konfigurationen neu geladen, Dienste aktiviert und deaktiviert werden, um ihr Verhalten beim Systemstart zu steuern, sowie die fortgeschrittenen Konzepte des Maskierens und Entmaskierens von Diensten, um deren Start zu verhindern. Diese umfassende Reihe von Fähigkeiten bietet eine solide Grundlage für die Verwaltung von Diensten auf RHEL-Systemen.



