Dienstkonfiguration mit systemctl neu laden
In diesem Schritt lernen Sie das Neuladen von Dienstkonfigurationen. Einige Dienste können Änderungen an ihren Konfigurationsdateien vornehmen, ohne einen vollständigen Neustart zu benötigen. Dies wird als "Neu laden" des Dienstes bezeichnet. Das Neu laden wird im Allgemeinen dem Neustart 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 verwenden weiterhin unseren Dienst mytest.service
aus dem vorherigen Schritt. Wir werden sein Verhalten ändern und ihn dann neu laden, um zu sehen, dass die Änderungen wirksam werden, ohne den Dienst anzuhalten und zu starten.
Stellen Sie zunächst sicher, dass mytest.service
läuft. Falls nicht, starten Sie ihn:
sudo systemctl start mytest.service
Überprüfen Sie seinen Status:
systemctl status mytest.service
Notieren Sie sich die Haupt-PID
von mytest.service
.
Ändern wir nun die Datei mytest.service
, um die protokollierte Nachricht und den Intervall zu ändern. Wir werden die Protokollnachricht und die sleep
-Dauer ändern.
Ö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=Mein Testdienst
After=network.target
[Service]
Type=simple
ExecStart=/bin/bash -c 'while true; do echo "$(date): Mein Testdienst (neu geladen) läuft." >> /tmp/mytest.log; sleep 2; done'
ExecStop=/bin/bash -c 'echo "$(date): Mein Testdienst gestoppt." >> /tmp/mytest.log'
Restart=on-failure
[Install]
WantedBy=multi-user.target
Speichern Sie die Datei, indem Sie Strg+X
, dann Y
und Eingabe
drücken.
Anstatt neu zu starten, laden wir den Dienst nun neu. Nicht alle Dienste unterstützen das Neu laden. Für Dienste, die dies tun, sendet systemctl reload
ein Signal (oft SIGHUP) an den Dienstprozess, um ihn aufzufordern, seine Konfigurationsdateien erneut zu lesen.
Laden Sie nach der Änderung der Dienstdatei die systemd-Konfiguration neu:
sudo systemctl daemon-reload
Führen Sie den Befehl zum Neu laden aus:
sudo systemctl reload mytest.service
Es wird keine sofortige Ausgabe geben, wenn der Befehl erfolgreich ist.
Überprüfen Sie nun erneut den Status des Dienstes:
systemctl status mytest.service
Beachten Sie die Haupt-PID
. Sie sollte die gleiche wie vor dem Neu laden sein, was darauf hinweist, dass der Dienstprozess selbst nicht beendet und neu gestartet wurde.
● mytest.service - Mein Testdienst
Geladen: geladen (/etc/systemd/system/mytest.service; statisch)
Aktiv: aktiv (läuft) seit ...
Haupt-PID: ... (bash) <-- Diese PID sollte gleich wie vor dem Neu laden sein
...Ausgabe ausgelassen...
Überprüfen Sie abschließend die Datei /tmp/mytest.log
, um zu sehen, ob die Änderungen wirksam geworden sind.
tail -f /tmp/mytest.log
Sie sollten nun die neue Nachricht "Mein Testdienst (neu geladen) läuft." alle 2 Sekunden sehen, was bestätigt, dass der Dienst seine Konfiguration ohne vollständigen Neustart neu geladen hat.
Drücken Sie Strg+C
, um tail
zu beenden.
reload-or-restart
-Option
Was ist, wenn Sie nicht sicher sind, ob ein Dienst das Neu laden unterstützt? systemctl
bietet eine praktische Option: reload-or-restart
. Dieser Befehl versucht, den Dienst neu zu laden, wenn dies unterstützt wird. Wenn das Neu laden nicht unterstützt wird, führt er stattdessen einen vollständigen Neustart durch. Dies ist eine sichere Methode, um Konfigurationsänderungen anzuwenden.
Demonstrieren wir dies. Stoppen Sie zunächst mytest.service
, um das Protokoll für einen frischen Start zu leeren:
sudo systemctl stop mytest.service
rm /tmp/mytest.log
Starten Sie ihn nun erneut:
sudo systemctl start mytest.service
Ändern Sie die Datei mytest.service
noch einmal. Ändern Sie die Nachricht wieder auf die ursprüngliche und die sleep
-Zeit auf 3 Sekunden.
sudo nano /etc/systemd/system/mytest.service
Ändern Sie ExecStart
auf:
ExecStart=/bin/bash -c 'while true; do echo "$(date): Mein Testdienst (original) läuft." >> /tmp/mytest.log; sleep 3; done'
Speichern Sie die Datei.
Laden Sie die systemd-Konfiguration neu und verwenden Sie dann reload-or-restart
:
sudo systemctl daemon-reload
sudo systemctl reload-or-restart mytest.service
Überprüfen Sie die Protokolldatei:
tail -f /tmp/mytest.log
Sie sollten "Mein Testdienst (original) läuft." alle 3 Sekunden sehen. Da unser mytest.service
für Neu ladungen ausgelegt ist (indem einfach der ExecStart
-Befehl erneut ausgeführt wird, was ein gängiges Muster für einfache Skripte ist), hätte reload-or-restart
ein Neu laden durchgeführt. Wenn es dies nicht unterstützt hätte, hätte es einen Neustart durchgeführt.
Drücken Sie Strg+C
, um tail
zu beenden.
Zum Schluss stoppen Sie den Dienst und bereinigen Sie die Protokolldatei:
sudo systemctl stop mytest.service
rm /tmp/mytest.log