Führen Sie das Skript mit systemd alle 30 Minuten aus

19

Ich möchte nach dem Booten des Systems alle 30 Minuten ein Skript ausführen. Ich weiß, dass Sie Cron verwenden können, aber ich habe nicht vor, diese Funktion oft zu verwenden, deshalb würde ich sie gerne mit systemd ausprobieren.

Bisher habe ich nur die monotonen Timer gefunden, die es erlauben, etwas einmal auszuführen (zumindest denke ich). Wie würde das foo.timerund [email protected]aussehen, wenn ich alle 30 Minuten nach dem Booten / Systemstart etwas ausführen möchte?

[email protected]

[Unit]
Description=run foo
Wants=foo.timer

[Service]
User=%I
Type=simple
ExecStart=/bin/bash /home/user/script.sh

foo.timer

[Unit]
Description=run foo

[Timer]
where I am stuck... ???
TomTom
quelle

Antworten:

26

Sie müssen zwei Dateien erstellen: eine für den Service und eine für den Timer mit demselben Namen.

Beispiel:

/etc/systemd/system/test.service

[Unit]
Description=test job

[Service]
Type=oneshot
ExecStart=/bin/bash /tmp/1.sh

/etc/systemd/system/test.timer

[Unit]
Description=test

[Timer]
OnUnitActiveSec=10s
OnBootSec=10s

[Install]
WantedBy=timers.target

Laden Sie danach das System mit dem Befehl neu systemctl daemon-reloadund starten Sie Ihren Timer mit systemctl start test.timeroder aktivieren Sie sie standardmäßig.

Testinhalt von 1.sh

#!/bin/bash
echo `date` >> /tmp/2

Und Befehl, um alle verfügbaren Timer zu überprüfen: systemctl list-timers --all

Weitere Informationen über Projekt detailliert Seite und Beispiele auf ArchLinux Seite

Reishin
quelle
systemd akzeptiert die Skripte und sie werden aufgelistet, es passiert jedoch nichts
TomTom
welcher? Es sollte zwei Skripte geben, einen Timer und einen anderen Dienst. Die Uhrzeit, zu der sie ausgeführt wurden, konnte mit dem Befehl list- timers überprüft werden. Mögliche Fehler konnten von systemctl status test.timerund systemctl status test.servicecomamand überprüft werden
Reishin,
1
Bitte benutzen Sie den systemctl list-timers --allBefehl und überprüfen Sie die Ausgabe. Er braucht wie seine diese . Suchen Sie nach Einheit, links und übergebenen Spalten. Wenn ein Timer vorhanden ist, schauen Sie in Ihre Servicedatei und suchen Sie dort nach Fehlern, da der Timer normal funktioniert.
Reishin,
1
nein, coz hauptfrage stellt nichts über "benachrichtigen-senden" und ich denke, wir sollten nicht zwei verschiedene dinge mischen, wenn ein solches thema bereits vorhanden ist. Versuchen Sie in Ihrem Fall, export DISPLAY=:0.0dem Skript etwas hinzuzufügen .
Reishin,
1
ps: laut man systemd.timer wirkt sich das Persistent = true nur auf die Konfiguration mit OnCalendar (dh die Wanduhr) aus
snyh
11

Hier ist eine weitere Option ohne Verwendung Ihres Timers. Wenn das Timing nicht besonders kritisch ist und das Skript nicht lange läuft, ist es für einfache Dinge in Ordnung.

[Unit]
Description=Run foo

[Service]
User=%I
Restart=always
RestartSec=1800s
ExecStart=/bin/bash /home/user/script.sh
Matt H
quelle
2
Ich mag diese Lösung. Der einzige große Nachteil ist, dass die Systemprotokolle mit den Protokollen "Starting <service X>" überschwemmt werden, wenn Sie häufig neu starten (dh alle 30 Sekunden). An diesem Punkt ist es möglicherweise besser, den Dienst als Dämon auszuführen, anstatt ihn immer wieder von systemd aus neu zu starten.
Jersey Bean
Das ist richtig. Für schnelle und einfache Dinge funktioniert es. Aber der Timer oder ein langes Skript wäre eine bessere Lösung.
Matt H