Wie kann ich einen Befehl ausführen, wenn eine systemd-Diensteinheit deaktiviert ist?

Wie kann ich einen Befehl ausführen, wenn eine systemd-Diensteinheit deaktiviert ist?

Ich habe die folgende systemd-Serviceeinheit, um die Batterieschwellenwerte meines Laptops einzustellen:

[Unit]
Description=Set Battery Charge Thresholds

[Service]
Type=oneshot
ExecStart=/usr/bin/tpacpi-bat -s --start 1 30
ExecStart=/usr/bin/tpacpi-bat -s --stop 1 85
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

Ich hätte gern eine Möglichkeit, Befehle auszuführen, wenn ich die Serviceeinheit deaktiviere (damit ich die Schwellenwerte bequem auf ihre Standardwerte zurücksetzen kann). Ist das möglich?

Antwort1

Schauen Sie sich an ExecStopoderExecStopPost

ExecStop

Auszuführende Befehle zum Stoppen des über ExecStart= gestarteten Dienstes. Dieses Argument akzeptiert mehrere Befehlszeilen und folgt dabei demselben Schema wie oben für ExecStart= beschrieben. Die Verwendung dieser Einstellung ist optional. Nachdem die in dieser Option konfigurierten Befehle ausgeführt wurden, werden alle für einen Dienst verbleibenden Prozesse gemäß der Einstellung KillMode= beendet (siehe systemd.kill(5)). Wenn diese Option nicht angegeben ist, wird der Prozess beendet, indem das in KillSignal= angegebene Signal gesendet wird, wenn ein Dienststopp angefordert wird. Die Ersetzung von Spezifizierern und Umgebungsvariablen wird unterstützt (einschließlich $MAINPID, siehe oben).

...

Es wird empfohlen, diese Einstellung für Befehle zu verwenden, die mit dem Dienst kommunizieren und eine saubere Beendigung anfordern. Wenn die mit dieser Option angegebenen Befehle ausgeführt werden, sollte davon ausgegangen werden, dass der Dienst noch vollständig aktiv ist und auf alle Befehle korrekt reagieren kann. Verwenden Sie für Bereinigungsschritte nach dem Abbruch stattdessen ExecStopPost=.

ExecStopPost

Zusätzliche Befehle, die ausgeführt werden, nachdem der Dienst gestoppt wurde. Dies umfasst Fälle, in denen die in ExecStop= konfigurierten Befehle verwendet wurden, in denen für den Dienst kein ExecStop= definiert ist oder in denen der Dienst unerwartet beendet wurde. Dieses Argument akzeptiert mehrere Befehlszeilen und folgt demselben Schema wie für ExecStart= beschrieben. Die Verwendung dieser Einstellungen ist optional. Die Ersetzung von Spezifizierern und Umgebungsvariablen wird unterstützt. Beachten Sie, dass – anders als bei ExecStop= – mit dieser Einstellung angegebene Befehle aufgerufen werden, wenn ein Dienst nicht ordnungsgemäß gestartet werden konnte und wieder heruntergefahren wird.

Es wird empfohlen, diese Einstellung für Bereinigungsvorgänge zu verwenden, die auch dann ausgeführt werden sollen, wenn der Dienst nicht ordnungsgemäß gestartet werden konnte. Mit dieser Einstellung konfigurierte Befehle müssen auch dann ausgeführt werden können, wenn der Dienst beim Starten auf halbem Weg fehlgeschlagen ist und unvollständig initialisierte Daten hinterlassen hat. Da die Prozesse des Dienstes bereits beendet wurden, wenn die mit dieser Einstellung angegebenen Befehle ausgeführt werden, sollten sie nicht versuchen, mit ihnen zu kommunizieren.

Beachten Sie, dass alle mit dieser Einstellung konfigurierten Befehle mit dem Ergebniscode des Dienstes sowie dem Exitcode und Status des Hauptprozesses aufgerufen werden, die in den Umgebungsvariablen $SERVICE_RESULT, $EXIT_CODE und $EXIT_STATUS festgelegt sind, siehe systemd.exec(5) für Details.

Beide können verwendet werden, um Befehle auszuführen, wenn der Dienst gestoppt ist.

Die Hauptunterschiede zwischen den beiden:

  • ExecStopwird ausgeführt, während der Hauptprozess noch läuft, und wird nur ausgeführt, wenn der Dienst nach dem normalen Ausführen gestoppt wird (was bedeutet, dass alle Dienste erfolgreich sein müssen ExecStartund ExecStartPrealle Dienste Conditions... ebenfalls erfolgreich sein müssen).

  • ExecStopPostläuft, auch wenn der „Dienst unerwartet beendet wurde“, was Fehler abdeckt. Der größte Vorteil davon ist, dass Sie, wenn Sie mehrere s haben , versuchen können, den Teilerfolg zu bereinigen, ExecStartwenn einer von ihnen erfolgreich ist und der andere fehlschlägt .ExecStopPost

verwandte Informationen