Starten / Beenden eines systemd.service zu bestimmten Zeiten

14

Ich möchte einen systemd.service zu bestimmten Zeiten starten und stoppen. Vermutlich werde ich eine .timer-Einheit zum Starten des Jobs verwenden, aber gibt es eine integrierte Möglichkeit, den Job nach einer bestimmten Dauer oder zu einer bestimmten Zeit zu stoppen , oder muss ich eine zweite .timer-Einheit erstellen, die das ausführt stop?

Vielen Dank

Jamie Kitson
quelle

Antworten:

6

Um einen Dienst A mit einem Zeitgeber zu stoppen, können Sie einen Dienst B des Typs erstellen oneshot, mit dem er in Konflikt steht , und dann einen Zeitgeber verwenden, um den Dienst B zu starten.

Wenn eine Einheit eine Konflikt = Einstellung auf einer anderen Einheit hat, stoppt das Starten der ersteren die letztere und umgekehrt. ( Quelle )

Ein Dienst:

[Unit]
Conflicts=B.service
...

B.service:

[Unit]
Description=B service description

[Service]
Type=oneshot
ExecStart=/bin/echo ''

B.timer:

[Timer]
AccuracySec=1
OnActiveSec=10

[Install]
WantedBy=timers.target

Das Folgende stoppt Service A nach 10 Sekunden.

systemctl start A.service
systemctl start B.timer
Radivarig
quelle
2

Es gibt in der Tat eine andere Möglichkeit, einen Dienst nach einer bestimmten in der .serviceDatei konfigurierten Laufzeit zu stoppen .

RuntimeMaxSec=...

Die Tatsache, dass der Dienst als fehlgeschlagen gilt, mag Ihnen vielleicht nicht gefallen, aber das ist mehr oder weniger logisch, wenn Sie einen Dienst beenden, der lange ausgeführt wird.

Um eine bessere Antwort zu erhalten, möchten Sie möglicherweise Ihre Gründe für die Verwendung einer solchen ungewöhnlichen Funktion erläutern. Dienste werden im Allgemeinen für immer ausgeführt oder bis sie explizit gestoppt werden, nicht nur für einen festgelegten Zeitraum.

Pavel Šimerda
quelle
1
Ja, wir haben dies und seine Einschränkungen in der Mailingliste besprochen: lists.freedesktop.org/archives/systemd-devel/2016-April/…
Jamie Kitson
1
Nicht ungewöhnlich. Was ist mit einem ressourcenintensiven Dienst, vielleicht SETI, der nur nachts ausgeführt wird, wenn der Server den geringsten Datenverkehr hat? Außerdem haben wir dort, wo ich arbeite, einen Alert-Daemon, der das Support-Team über seine Telefone wecken soll, wenn auf den Servern eine Ausnahme auftritt. Wir wollen wirklich nicht, dass das nervige Ding läuft, wenn wir tatsächlich wach sind, weil diese Server Probleme haben, wenn sie zu Spitzenzeiten genutzt werden.
James M. Lay
0

Sie könnten ein paar Cron-Jobs verwenden:

 # ┌───────────── min (0 - 59) 
 # │ │ Stunde (0 - 23)
 # │ │ ┌─────────────── Tag des Monats (1 - 31)
 # │ │ │ │ Monat (1 - 12)
 # │ │ │ │ │ Wochentag (0 - 6)
 # │ │ │ │ │
 # │ │ │ │ │
   * * * * * systemctl start $ SERVICE.service
   * * * * * systemctl stop $ SERVICE.service

Weitere Informationen zu cron: https://en.wikipedia.org/wiki/Cron , https://wiki.archlinux.org/index.php/Cron

John Moon
quelle
8
Wie ist ein Cron-Job eine Verbesserung gegenüber Systemeinheiten .timer, die OP bereits kennt?
Pavel Šimerda
Ich könnte ja, aber meine Frage ist wirklich, wie man das mit systemd richtig macht? Ich gehe davon aus, dass es eine Standardmethode geben muss, um einen Job zu einem bestimmten Zeitpunkt oder nach einer bestimmten Dauer zu stoppen.
Jamie Kitson
@JamieKitson Um ehrlich zu sein , glaube ich nicht , dass es tatsächlich braucht ein solches Feature über cron und systemd Timer zu sein. Die meisten Systeminstallationen werden niemals solche Funktionen verwenden und es ist nichts Falsches daran, systemctlmit Cron, System-Timern und was auch immer Sie wollen zu laufen . Meiner Meinung nach ist diese Antwort genauso gültig wie jede andere Antwort.
Pavel Šimerda
Wie können Sie zum Beispiel WWW-Daten zum Ausführen von SystemCTL starten und stoppen?
Alvaropgl
@alvaropgl Ihr Kommentar hat nichts mit Benutzern (www-Daten) zu tun und welchen eingeschränkten Zugriff sie möglicherweise haben, um Prozesse (systemctl) auszuführen / nicht auszuführen. Dies ist das Thema. Bitte starten Sie ein neues Thema. Tipp: Möglicherweise möchten Sie eine API erstellen, um die gewünschten Aufgaben zu erledigen, und nicht Ihren derzeitigen Ansatz, dem Benutzer von www-data mehr Verantwortungsbereich zu geben.
Scott Prive