
Ich habe ein Programm, das über Systemd läuft, und versuche herauszufinden, wie ich es zu bestimmten Zeiten starten/stoppen kann. Es ist ein persistentes Programm (Übertragung).
Derzeit habe ich eine Crontab mit den folgenden Zeilen:
0 8 * * * systemctl stop transmission-daemon
0 20 * * * systemctl start transmission-daemon
Ich habe Probleme, dies in eine Systemd-Timerdatei zu übersetzen.
Ist es darüber hinaus möglich, dass systemd (oder cron) im Falle eines Neustarts anhand der aktuellen Uhrzeit prüft, ob der Dienst ausgeführt werden soll oder nicht?
Vielen Dank für Ihre Hilfe. Wenn dies schon einmal gefragt wurde, nennen Sie mir bitte konkrete Beispiele für genau diese Art von Dingen. Das meiste, was ich finden kann, ist, wie man einen Dienst in 15-Minuten-Intervallen und Ähnlichem ausführt.
Antwort1
Es wäre vielleicht einfacher, einen Timer zu haben, der einmal pro Stunde und beim Neustart ein Skript ausführt. Dieses Skript prüft, ob der Daemon in der aktuellen Stunde ausgeführt werden sollte oder nicht, und systemctl is-active $service
startet oder stoppt dann bei Bedarf (möglicherweise nach einer Prüfung) den Dienst. Dieses Skript könnte auch nach einer Datei suchen oder auf einer anderen Geschäftslogik basieren, um zu bestimmen, ob Dinge ausgeführt werden müssen oder nicht. Beispielsweise touch ~/.fooservice-do-not-run
könnte eine Datei Dinge deaktivieren oder die Last zu hoch sein usw.
Antwort2
Um Dienste über Timer in systemd zu starten, verwenden Sie zwei Unit-Dateien. EineX.DienstDatei zur Beschreibung des eigentlichen Dienstes und eineX.timerDatei, um zu beschreiben, wann der Dienst gestartet werden soll.
Um einen Dienst wie beschrieben ein- und auszuschalten, ist meiner Meinung nach am besten ein separaterXoffPaar Unit-Dateien, wobei dieServiceDateien stehen in Konflikt miteinander. DieXoffDer Dienst tut eigentlich nichts, er ist nur da, um „ausgeführt“ zu werden, wenn der eigentliche Dienst ausgeschaltet ist.
Um Ihnen eine Vorstellung zu geben, hier ein Spielzeugbeispiel mit einem Serviceschlafendas jede gerade Minute eingeschaltet und jede ungerade Minute ausgeschaltet wird.
Schlafservice:
[Unit]
Description=Test service not doing anything real.
Conflicts=sleepoff.service
[Service]
ExecStart=/usr/bin/sleep 1d
Schlaftimer:
[Unit]
Description=Timer to start the sleep service.
[Timer]
OnCalendar=*:0/2
sleepoff.service:
[Unit]
Description=Dummy service "running" when the real unit is off.
Conflicts=sleep.service
[Service]
Type=oneshot
ExecStart=/usr/bin/true
RemainAfterExit=true
sleepoff.timer:
[Unit]
Description=Timer to stop the sleep service.
[Timer]
OnCalendar=*:1/2