[gelöst] .timer soll alle x sekunden einen service/script ausführen

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Benutzeravatar
joe2017
Beiträge: 600
Registriert: 07.08.2017 14:29:51

[gelöst] .timer soll alle x sekunden einen service/script ausführen

Beitrag von joe2017 » 11.06.2019 16:36:46

Hallo zusammen,

ich habe ein Script geschrieben, welches alle x Sekunden ausgeführt werden soll. Hierzu habe ich einen Timer und einen Service erstellt welche dieses Script ausführen. Das funktioniert soweit alles bestens. Jedoch wird mein Script nicht alle x sekunden wie eingestellt ausgeführt. Vielleicht sieht jemand mein Fehler und gibt mir einen kleinen Tipp.

Timer:

Code: Alles auswählen

[unit]
Description=blablabla

[Timer]
OnBootSec=0min
OnUnitActiveSec=5s
Unit=hier steht der name meines Service.service

[Install]
WantedBy=timers.target
Eigentlich sollte der Service alle 5 Sec ausgeführt werden.
Zuletzt geändert von joe2017 am 11.06.2019 17:31:51, insgesamt 2-mal geändert.

TomL
Beiträge: 5135
Registriert: 24.07.2014 10:56:59

Re: .timer soll alle x sekunden einen service/script ausführen

Beitrag von TomL » 11.06.2019 16:45:27

Der Fehler ist m.M.n. die Service-Unit an sich. Ich würde vor dem Hintergrund des sehr kurzen Zyklus das Script "einmalig" via Service-Unit starten und dann im Script innerhalb eines Endlos-Loops einen 5-Sekunden-Sleep eintragen. Die startende Service-Unit bekommt dann nur noch ein restart-allways-Statement und gut ists. Einen timer für so kurze Zyklen schätze ich fast als Design-Fehler ein.
vg, Thomas

Benutzeravatar
joe2017
Beiträge: 600
Registriert: 07.08.2017 14:29:51

Re: .timer soll alle x sekunden einen service/script ausführen

Beitrag von joe2017 » 11.06.2019 16:49:32

Hi TomL,

danke für deine schnelle Info. Das war auch mein erster Plan. Wenn es aber ein Problem mit dem Script gibt, oder dieses Beendet würd, wird es nicht weiter ausgeführt.
Mit dem Timer würde es immer wieder gestartet werden. Deshalb habe ich den größeren Aufwand gewählt.

Benutzeravatar
Lord_Carlos
Beiträge: 5177
Registriert: 30.04.2006 17:58:52
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Dänemark

Re: .timer soll alle x sekunden einen service/script ausführen

Beitrag von Lord_Carlos » 11.06.2019 16:54:01

Was sagt systemctl status foo.timer? systemctl list-timers --all zeigt in an?
systemctl daemon-reload hast du nach dem erstellen des timers gemacht?
Timer hat du aktivert? systemctl enable foo.timer

Code: Alles auswählen

╔═╗┬ ┬┌─┐┌┬┐┌─┐┌┬┐╔╦╗
╚═╗└┬┘└─┐ │ ├┤ │││ ║║
╚═╝ ┴ └─┘ ┴ └─┘┴ ┴═╩╝ rockt das Forum!

Benutzeravatar
joe2017
Beiträge: 600
Registriert: 07.08.2017 14:29:51

Re: .timer soll alle x sekunden einen service/script ausführen

Beitrag von joe2017 » 11.06.2019 17:00:25

systemctl list-timers --all das zeigt meinen timer gar nicht an.
Aktiviert habe ich meinen Timer natürlich. Der Timer funktioniert ja auch. Jedoch nur nicht in der angegebenen Zeit.
Mein Timer liegt in folgendem Verzeichnis: /etc/systemd/user/
Hier liegt im übrigen auch mein Script.

Benutzeravatar
Lord_Carlos
Beiträge: 5177
Registriert: 30.04.2006 17:58:52
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Dänemark

Re: .timer soll alle x sekunden einen service/script ausführen

Beitrag von Lord_Carlos » 11.06.2019 17:07:29

Mit script meinst du script? Oder Service?
Geht das service denn ueberhaupt?

Meine timers and services liegen hier: /etc/systemd/system

Code: Alles auswählen

╔═╗┬ ┬┌─┐┌┬┐┌─┐┌┬┐╔╦╗
╚═╗└┬┘└─┐ │ ├┤ │││ ║║
╚═╝ ┴ └─┘ ┴ └─┘┴ ┴═╩╝ rockt das Forum!

JTH
Beiträge: 703
Registriert: 13.08.2008 17:01:41

Re: .timer soll alle x sekunden einen service/script ausführen

Beitrag von JTH » 11.06.2019 17:15:19

Ein paar Anmerkungen:

Die Zeile ManagedBy=timers.target in deinem Timer ist verkehrt, das sollte wahrscheinlich WantedBy= werden. (Oder bin ich da nicht mehr auf dem neuesten Stand?) Wenn du das verbesserst anschließend

Code: Alles auswählen

# systemctl --global daemon-reload
# systemctl --global enable X.timer
nicht vergessen.

Wenn der Timer per User läuft (da unter /etc/systemd/user) musst du systemctl jedes mal ein --user mitgeben, z.B.

Code: Alles auswählen

$ systemctl --user list-timers
$ systemctl --user status X.timer

Wenn du Timer im x-Sekunden-Takt ausführen willst, muss du die Genauigkeit des Timers erhöhen. Die ist per Default nur bei 1 min:

Code: Alles auswählen

[…]

[Timer]
AccuracySec=1

[…]

Die Zeile mit OnBootSec= kannst du dir vermutlich sparen. Da es ein User-Timer ist, läuft er sowieso erst, wenn sich ein Benutzer anmeldet.

Benutzeravatar
joe2017
Beiträge: 600
Registriert: 07.08.2017 14:29:51

Re: .timer soll alle x sekunden einen service/script ausführen

Beitrag von joe2017 » 11.06.2019 17:15:41

Oh Entschuldigung. Ja ich meinte natürlich service und timer

Benutzeravatar
joe2017
Beiträge: 600
Registriert: 07.08.2017 14:29:51

Re: .timer soll alle x sekunden einen service/script ausführen

Beitrag von joe2017 » 11.06.2019 17:18:04

Und noch einmal mein Fehler! Das kommt davon wenn man in gedanken ist und abschreibt anstatt zu kopieren. Natürlich steht hier "WantedBy=" Ich bessere das oben gleich mal aus!
Bei dem folgenden Befehl sehe ich jetzt den Service. Dieser wird immer noch alle 1 Minute ausgeführt.
systemctl list-timers --all --user

Trotz der Erweiterung

Code: Alles auswählen

OnCalendarSec=5s
AccuracySec=1s
Folgendes hat jetzt geholfen!

Code: Alles auswählen

systemctl --global daemon-reload
Vielen Dank!
Zuletzt geändert von joe2017 am 11.06.2019 17:27:39, insgesamt 1-mal geändert.

TomL
Beiträge: 5135
Registriert: 24.07.2014 10:56:59

Re: .timer soll alle x sekunden einen service/script ausführen

Beitrag von TomL » 11.06.2019 17:27:34

joe2017 hat geschrieben: ↑ zum Beitrag ↑
11.06.2019 16:49:32
Wenn es aber ein Problem mit dem Script gibt, oder dieses Beendet würd, wird es nicht weiter ausgeführt.
Nein, das stimmt so nicht... natürlich wird es bei einem Fehler (Absturz) erneut gestartet und wieder ausgeführt. Deswegen hatte ich auf das Statement "restart-always" oder alternativ "on-failure" hingewiesen. Siehe: https://www.freedesktop.org/software/sy ... rvice.html.

Mit dem 5-Sekunden-Timer erzeugst Du meiner Meinung nach auf jeden Fall eine unverhältnismäßige Systemlast für den Systemmanager, die permanent die CPU-Last und damit den Stromverbrauch hochhält. Ich halte das auf jeden Fall für einen Design-Fehler und würde das anders lösen. Mit dem 5-sec-Sleep-Statement im Script hättest Du diesen imho negativen Umstand nicht.
Zuletzt geändert von TomL am 11.06.2019 17:33:57, insgesamt 1-mal geändert.
vg, Thomas

Benutzeravatar
joe2017
Beiträge: 600
Registriert: 07.08.2017 14:29:51

Re: [gelöst] .timer soll alle x sekunden einen service/script ausführen

Beitrag von joe2017 » 11.06.2019 17:32:59

Was würdest du mir vorschlagen? Ein Sleep im Script würde doch das selbe verursachen.

TomL
Beiträge: 5135
Registriert: 24.07.2014 10:56:59

Re: [gelöst] .timer soll alle x sekunden einen service/script ausführen

Beitrag von TomL » 11.06.2019 17:37:52

joe2017 hat geschrieben: ↑ zum Beitrag ↑
11.06.2019 17:32:59
Was würdest du mir vorschlagen? Ein Sleep im Script würde doch das selbe verursachen.
Nein, überhaupt nicht.... der sleep ist hinsichtlich CPU völlig neutral. Damit wird aber der komplette Verwaltungs-Overhead für den System-Manager vermieden. Und sofern das Programm möglicherweise jedesmal auch noch von der Platte geladen wird, wird auch noch durchgängig die Platte am Spindown gehindert.... da weiss ich allerdings nicht, ob der Cache darauf noch Einfluss hat. Allerdings hätte ich keine Lust, das herauszufinden, sondern würde solche Effekte von vornherein durch eine andere Logik ausschließen.
vg, Thomas

Benutzeravatar
joe2017
Beiträge: 600
Registriert: 07.08.2017 14:29:51

Re: [gelöst] .timer soll alle x sekunden einen service/script ausführen

Beitrag von joe2017 » 11.06.2019 17:43:01

Mein Script prüft auch nur einen bestimmten Inhalt einer Datei. Wenn in dieser Datei nichts verändert wird, wird sonst auch nichts ausgeführt. Lediglich die Ausführung des Scripts wird durchgeführt.
Aber wenn du der Meinung bist, dass ich hier grundlegend etwas falsch denke, dann nehme ich deinen Rat sehr gerne an. Ich dachte einfach das ich es gleich richtig mache.

TomL
Beiträge: 5135
Registriert: 24.07.2014 10:56:59

Re: [gelöst] .timer soll alle x sekunden einen service/script ausführen

Beitrag von TomL » 11.06.2019 17:51:34

joe2017 hat geschrieben: ↑ zum Beitrag ↑
11.06.2019 17:43:01
Mein Script prüft auch nur einen bestimmten Inhalt einer Datei.
Mir gings nicht um die Datei, sondern das Script wird ja im 5 Sekunden-Zyklus geladen, erzeugt eine Prozess-ID, der System-Manager richtet seine Überwachung ein, und nach Ende muss alles wieder aufgeräumt werden, um sofort wieder von vorne anzufangen.

Um die Datei auf Änderungen zu prüfen, würde ich auch einfach mal Debianinotify-tools oder Debianincron erwähnen, dann spart man sich die permanente Überwachung und nutzt einen Eventhandler. Letztlich ist es aber wieder so, dass man faktisch keinen Rat geben kann, weil wieder nicht bekannt ist, mit welchen Zutaten zu welchen Ereignissen welcher Kuchen für welche Gäste in welcher Größenordnung gebacken werden soll. Insofern können alle Ratschläge als Zufallstreffer passen oder eben nicht. Aber so ein Vorgehen ist m.M.n. Zeitverschwendung.
vg, Thomas

Benutzeravatar
joe2017
Beiträge: 600
Registriert: 07.08.2017 14:29:51

Re: [gelöst] .timer soll alle x sekunden einen service/script ausführen

Beitrag von joe2017 » 11.06.2019 17:57:48

Ja da stimme ich dir vollkommen zu. Die Anforderung habe ich hier nicht genau beschrieben, da ich nur nach einer Lösung zu einem Problem innerhalb meiner Routine gefragt habe.
Aber wahrscheinlich hast du Recht mit deiner Vermutung. Ich werde mir das Thema mal genauer anschauen und evtl nur mit einem Script arbeiten. Vielleicht ist das in diesem Fall auch ausreichend.

Vielen Dank auf jeden fall für deinen Gedankenanstoß. Ich lerne gerne immer weiter dazu.
Ich bin jetzt auch noch kein eingefleischter Debian User und lerne täglich dazu.

Nochmal ein großes Lob an alle User hier. Hier bekommt man immer nützliche Informationen welche mir bis jetzt immer weiterhelfen konnten.

Antworten