Top 5 systemctl-Befehle zur Steigerung Ihrer Linux-Produktivität
Fünf praktische systemctl-Befehle zum Überprüfen, Steuern, Aktivieren, Auflisten und Neuladen von Linux-Diensten.
Top 5 systemctl-Befehle zur Steigerung Ihrer Linux-Produktivität
Linux-Systeme verlassen sich für fast alles auf Hintergrunddienste: SSH-Zugriff, Netzwerk, Protokollierung, Webserver, Datenbanken, geplante Aufgaben und Desktop-Anmeldebildschirme. Wenn einer dieser Dienste sich schlecht verhält, ist systemctl normalerweise das erste Werkzeug, zu dem Sie greifen.
systemctl ist die wichtigste Befehlszeilenschnittstelle für systemd, den Dienstmanager, der von vielen gängigen Linux-Distributionen verwendet wird. Sie müssen nicht jeden Unterbefehl auswendig lernen, um effektiv zu sein. Im täglichen Betrieb deckt eine kleine Gruppe von Befehlen die meisten Dienstüberprüfungen, Neustarts, Boot-Konfigurationsänderungen und Unit-Datei-Updates ab.
Systemd und systemctl verstehen
Bevor wir uns mit den Befehlen befassen, lassen Sie uns kurz systemd und systemctl betrachten. systemd ist für die Initialisierung des Systems, die Verwaltung von Diensten, die Handhabung von Prozessen und mehr verantwortlich. Es ersetzt ältere Init-Systeme wie SysVinit und Upstart und bietet schnellere Bootzeiten, parallelen Dienststart und ein robusteres Abhängigkeitsmanagement. systemctl ist Ihr Fenster in die systemd-Welt und ermöglicht es Ihnen, den Status von Diensten, Units und Targets zu steuern und abzufragen.
Eine "Unit" in der systemd-Terminologie bezieht sich auf jede Ressource, die systemd zu verwalten weiß. Dienste (.service), Mountpoints (.mount), Geräte (.device), Sockets (.socket) und Targets (.target) sind gängige Unit-Typen. Für den Zweck dieses Artikels konzentrieren wir uns hauptsächlich auf Service-Units, die Daemon-Prozesse repräsentieren, die von systemd verwaltet werden.
Die Top 5 systemctl-Befehle für verbesserte Produktivität
Hier sind fünf systemctl-Befehle, die Ihre Fähigkeit, die Dienste Ihres Linux-Systems zu verwalten und zu überwachen, erheblich verbessern werden.
1. systemctl status [DIENSTNAME]
Zweck: Dieser Befehl ist Ihre erste Verteidigungslinie zur Überwachung des Zustands und der Aktivität eines jeden Dienstes. Er liefert detaillierte Informationen, einschließlich, ob ein Dienst läuft, kürzlich gestoppt wurde, für den Autostart aktiviert ist und sogar die letzten paar Protokolleinträge.
Warum es produktiv ist: Diagnostizieren Sie Probleme schnell, bestätigen Sie Dienststart/-stopp und erhalten Sie eine Momentaufnahme des Zustands eines Dienstes, ohne manuell in Protokolldateien graben zu müssen.
Beispiel:
Um den Status des Apache-Webservers zu überprüfen (httpd.service auf einigen Distributionen, apache2.service auf anderen wie Debian/Ubuntu):
systemctl status apache2.service
Ausgabeinterpretation (Beispiel):
● apache2.service - The Apache HTTP Server
Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor preset: enabled)
Active: active (running) since Tue 2023-10-26 10:00:00 UTC; 1min 2s ago
Docs: https://httpd.apache.org/docs/2.4/
Process: 1234 ExecStart=/usr/sbin/apachectl start (code=exited, status=0/SUCCESS)
Main PID: 1239 (apache2)
Tasks: 6 (limit: 4639)
Memory: 21.6M
CPU: 184ms
CGroup: /system.slice/apache2.service
├─1239 /usr/sbin/apache2 -k start
├─1240 /usr/sbin/apache2 -k start
└─1241 /usr/sbin/apache2 -k start
Oct 26 10:00:00 servername systemd[1]: Starting The Apache HTTP Server...
Oct 26 10:00:00 servername systemd[1]: Started The Apache HTTP Server.
Diese Ausgabe sagt Ihnen:
Loaded: Wo sich die Unit-Datei befindet und ob sie für den Start beim Booten aktiviert ist.Active: Aktueller Status (z.B.active (running),inactive (dead),failed).- Aktuelle Protokolleinträge von
journalctl.
Tipp: Drücken Sie q, um die Statusansicht zu verlassen.
Zwei Details in status sind leicht zu übersehen. Erstens sagt Ihnen Loaded:, ob die Unit-Datei existiert und ob sie für den Bootvorgang aktiviert ist. Ein Dienst kann active (running) und dennoch disabled sein; das bedeutet, er wurde manuell oder von einer anderen Abhängigkeit gestartet, wird aber nicht unbedingt beim nächsten Booten starten. Zweitens sind die letzten Protokollzeilen nur eine Vorschau. Wenn der nützliche Fehler herausgescrollt ist, verwenden Sie journalctl -u apache2.service anstatt zu versuchen, alles aus status herauszupressen.
Für Skripte und Überwachungsprüfungen bevorzugen Sie maschinenfreundliche Befehle:
systemctl is-active --quiet apache2.service
systemctl is-enabled apache2.service
is-active --quiet beendet sich mit dem Statuscode 0, wenn der Dienst aktiv ist. Das macht es nützlich in einer kleinen Gesundheitsprüfung:
if ! systemctl is-active --quiet apache2.service; then
echo "apache2 läuft nicht"
fi
2. systemctl start|stop|restart [DIENSTNAME]
Zweck: Diese Befehle geben Ihnen die direkte Kontrolle über den Laufzeit-Lebenszyklus eines Dienstes.
start: Startet einen Dienst.stop: Stoppt einen laufenden Dienst.restart: Stoppt und startet dann einen Dienst (nützlich zum Anwenden von Konfigurationsänderungen).
Warum es produktiv ist: Unverzichtbar für die grundlegende Dienstwartung, Fehlerbehebung und das Anwenden von Konfigurationsaktualisierungen. Anstatt das gesamte System neu zu starten, können Sie einzelne Dienste präzise steuern.
Beispiele: Um den Apache-Webserver zu stoppen:
sudo systemctl stop apache2.service
Um ihn wieder zu starten:
sudo systemctl start apache2.service
Um ihn nach der Änderung seiner Konfigurationsdateien neu zu starten:
sudo systemctl restart apache2.service
Warnung: Diese Befehle erfordern in der Regel sudo-Berechtigungen, da sie systemweite Dienste betreffen. Stellen Sie immer sicher, dass Sie den richtigen Dienst anvisieren, um unbeabsichtigte Unterbrechungen zu vermeiden.
Verwenden Sie restart vorsichtig bei Produktionsdiensten. Es stoppt den Prozess und startet ihn neu, was aktive Verbindungen abbrechen kann, es sei denn, die Anwendung behandelt das Graceful Shutdown gut. Wenn die Unit Neuladungen unterstützt, ist dies oft besser nach einer reinen Konfigurationsänderung:
sudo systemctl reload nginx.service
Nicht jeder Dienst unterstützt das Neuladen. Überprüfen Sie die Unit-Definition, bevor Sie annehmen, dass dies der Fall ist:
systemctl cat nginx.service | grep ExecReload
Wenn es kein ExecReload= gibt, wird systemctl reload in der Regel fehlschlagen. In diesem Fall starten Sie entweder den Dienst neu oder verwenden den anwendungsspezifischen Neuladebefehl.
3. systemctl enable|disable [DIENSTNAME]
Zweck: Diese Befehle verwalten, ob ein Dienst automatisch startet, wenn Ihr System hochfährt.
enable: Konfiguriert einen Dienst so, dass er automatisch beim Booten startet. Dies erstellt einen symbolischen Link vom entsprechendensystemd-Target-Verzeichnis zur Unit-Datei des Dienstes.disable: Verhindert, dass ein Dienst automatisch beim Booten startet, indem der symbolische Link entfernt wird.
Warum es produktiv ist: Kontrollieren Sie die Ressourcennutzung, optimieren Sie Bootzeiten und stellen Sie sicher, dass kritische Dienste immer verfügbar sind (oder verhindern Sie, dass unnötige laufen).
Beispiele: Um sicherzustellen, dass Apache jedes Mal startet, wenn Ihr System bootet:
sudo systemctl enable apache2.service
Um zu verhindern, dass ein unnötiger Dienst (z.B. cups.service, wenn Sie kein Drucken verwenden) beim Booten startet:
sudo systemctl disable cups.service
Bewährte Praxis: Deaktivieren Sie Dienste, die Sie nicht benötigen, aber überprüfen Sie zuerst, was von ihnen abhängt. Auf einem Laptop könnte das Deaktivieren von Bluetooth oder Drucken harmlos sein. Auf einem Server kann das Deaktivieren eines Netzwerk-, Speicher- oder Authentifizierungsdienstes ohne Überprüfung der Abhängigkeiten Sie aussperren oder den Bootvorgang unterbrechen.
Denken Sie daran, dass enable und disable nur das Bootverhalten beeinflussen. Sie starten oder stoppen den Dienst nicht sofort. Wenn Sie beide Aktionen zusammen möchten, verwenden Sie:
sudo systemctl enable --now apache2.service
sudo systemctl disable --now cups.service
--now ist nützlich, weil es einen häufigen Fehler beseitigt: einen Dienst zu aktivieren und anzunehmen, dass er bereits läuft.
4. systemctl list-unit-files --type=service
Zweck: Dieser Befehl listet alle Ihrem System bekannten systemd-Service-Unit-Dateien zusammen mit ihrem enabled- oder disabled-Status auf. Dies ist unglaublich nützlich, um einen Überblick über die auf Ihrem System konfigurierten Dienste zu erhalten.
Warum es produktiv ist: Hilft Ihnen, installierte Dienste zu entdecken, unnötige zu identifizieren und die Boot-Konfiguration Ihres Systems zu überprüfen. Es ist ein leistungsstarkes Werkzeug für die Systemerkundung und -bereinigung.
Beispiel:
systemctl list-unit-files --type=service
Teilausgabe (Beispiel):
UNIT FILE STATE
acpid.service enabled
aptd-auto-update.service static
apt-daily.service static
apache2.service enabled
avahi-daemon.service enabled
bluetooth.service enabled
cups.service enabled
... (viele weitere Dienste)
78 unit files listed.
Tipp: Die Spalte STATE gibt an, ob der Dienst so konfiguriert ist, dass er beim Booten startet (enabled), explizit verhindert wird (disabled) oder static ist (kann nicht direkt über systemctl enable/disable aktiviert/deaktiviert werden, oft Abhängigkeiten oder interne systemd-Units).
Filtern: Sie können die Ausgabe an grep weiterleiten, um bestimmte Dienste zu finden:
systemctl list-unit-files --type=service | grep ssh
Wenn Sie sich für laufende Dienste und nicht für installierte Unit-Dateien interessieren, verwenden Sie stattdessen list-units:
systemctl list-units --type=service --state=running
systemctl list-units --type=service --state=failed
Diese Unterscheidung ist bei der Bereinigung wichtig. list-unit-files sagt Ihnen, was systemd zu starten weiß. list-units sagt Ihnen, was systemd in seinem aktuellen Laufzeitzustand geladen hat.
5. systemctl daemon-reload
Zweck: Nachdem Sie eine systemd-Unit-Datei geändert haben (z.B. eine neue Dienstdatei in /etc/systemd/system/ erstellt oder eine vorhandene bearbeitet haben), erkennt systemd diese Änderungen nicht automatisch. systemctl daemon-reload weist systemd an, alle Unit-Dateien erneut zu scannen und ihre Konfigurationen neu zu laden.
Warum es produktiv ist: Vermeidet die Notwendigkeit eines vollständigen Systemneustarts, nur um Konfigurationsänderungen an Diensten anzuwenden. Es ist entscheidend für Entwickler und Administratoren, die häufig Dienstkonfigurationen ändern.
Beispiel:
Angenommen, Sie haben eine neue Service-Unit-Datei für Ihre benutzerdefinierte Anwendung mywebapp.service erstellt.
Erstellen Sie
/etc/systemd/system/mywebapp.service.Laden Sie die Konfiguration von
systemdneu:
sudo systemctl daemon-reload ```
Jetzt kennt
systemdmywebapp.service, und Sie können esstart,enable,status:
sudo systemctl start mywebapp.service sudo systemctl enable mywebapp.service systemctl status mywebapp.service ```
Wichtig: daemon-reload lädt nur die Unit-Definitionen neu. Wenn ein Dienst bereits läuft, werden Änderungen an seiner Unit-Datei erst wirksam, wenn der Dienst neu gestartet wird (systemctl restart [DIENSTNAME]).
Ein einfacher täglicher Arbeitsablauf
Wenn ich auf einem unbekannten Server lande, arbeite ich normalerweise in dieser Reihenfolge:
systemctl status sshd.service
systemctl list-units --type=service --state=failed
systemctl list-unit-files --type=service | grep enabled
systemctl get-default
Das gibt Ihnen ein schnelles Bild des Hosts: ob der Fernzugriff in Ordnung ist, ob Units fehlgeschlagen sind, was für den Start beim Booten konfiguriert ist und ob die Maschine voraussichtlich in ein serverartiges oder grafisches Target bootet.
Für eine Dienständerung ist der Arbeitsablauf genauso kurz:
sudo systemctl edit myapp.service
sudo systemctl daemon-reload
sudo systemctl restart myapp.service
systemctl status myapp.service
journalctl -u myapp.service -n 50 --no-pager
Diese Sequenz hält die Änderung sichtbar, lädt den systemd-Unit-Cache neu, startet nur den betroffenen Dienst neu und überprüft die Protokolle, bevor Sie weggehen. Sie verhindert viele vermeidbare Neustarts und Rätselraten.
Ein paar nützliche Variationen
Sobald sich die Kernbefehle natürlich anfühlen, fügen Sie ein paar Variationen hinzu, die Zeit sparen, ohne den grundlegenden Arbeitsablauf zu ändern.
Um nur fehlgeschlagene Units zu sehen:
systemctl --failed
Dies ist eine der schnellsten Überprüfungen nach einem Neustart. Wenn ein Paket-Update eine Unit geändert hat, ein Mount-Timeout aufgetreten ist oder ein benutzerdefinierter Dienst während des Bootens abgestürzt ist, wird dies oft hier angezeigt, bevor ein Benutzer ein Problem meldet.
Um den genauen Unit-Inhalt zu überprüfen, den systemd geladen hat:
systemctl cat docker.service
Dies ist wichtig, weil die Datei, an deren Bearbeitung Sie sich erinnern, möglicherweise nicht die ganze Geschichte ist. Eine Paket-Unit in /usr/lib/systemd/system/ kann durch einen oder mehrere Drop-Ins unter /etc/systemd/system/docker.service.d/ modifiziert werden. systemctl cat zeigt die kombinierte Ansicht, sodass Sie nicht die falsche Datei debuggen.
Um zu sehen, warum ein Dienst beim Booten startet:
systemctl list-dependencies multi-user.target
systemctl list-dependencies graphical.target
Dies hilft, wenn jemand fragt: "Warum läuft das?" Ein Dienst kann direkt aktiviert, von einem Target gezogen, socket-aktiviert oder von einer anderen Unit gestartet sein. Das Bootverhalten ist oft eine Abhängigkeitsfrage, nicht nur eine Frage von aktiviert oder deaktiviert.
Um aktuelle Protokolle zu überprüfen, ohne einen Pager zu öffnen:
journalctl -u sshd.service -n 50 --no-pager
systemctl status gibt eine kleine Protokollvorschau, aber journalctl gibt Ihnen die Kontrolle über Zeitbereich, Boot, Zeilenanzahl und Ausgabeformat. Zum Beispiel:
journalctl -u sshd.service --since "today" --no-pager
journalctl -u sshd.service -b -1 --no-pager
Der zweite Befehl überprüft den vorherigen Boot, was nach einem Absturz oder unerwarteten Neustart nützlich ist.
Es gibt keinen Preis für die Verwendung des längsten systemctl-Befehls. Produktivität kommt davon, zu wissen, welcher kleine Befehl die aktuelle Frage beantwortet: Läuft es, sollte es beim Booten starten, was ist fehlgeschlagen, was hat sich geändert, und hat systemd die Definition neu geladen, die ich bearbeitet habe?
Eine letzte Gewohnheit hilft auf gemeinsam genutzten Maschinen: Hinterlassen Sie Beweise für das, was Sie geändert haben. Wenn Sie einen Dienst deaktivieren, notieren Sie den Grund in Ihrem Ticket, Runbook oder Änderungsprotokoll. Sechs Monate später könnte jemand disabled sehen und annehmen, es sei ein Fehler. Der Befehl ist einfach:
sudo systemctl disable --now old-worker.service
Der operative Kontext ist der Teil, den die Leute verlieren. Wurde es durch einen Timer ersetzt? Hat es doppelte Jobs verursacht? Wurde es nur während der Migration benötigt? systemctl kann den Zustand anzeigen, aber es kann nicht die Absicht erklären. Eine kurze Notiz neben der Änderung bewahrt die nächste Person davor, eine gute Entscheidung rückgängig zu machen.