Sekundengenauer cronjob

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Welcometofuture
Beiträge: 1
Registriert: 04.12.2016 11:38:36

Sekundengenauer cronjob

Beitrag von Welcometofuture » 04.12.2016 12:39:32

Hallo,
als absoluter Newbee unter Debian bin ich an meine Grenzen gestoßen und würde gerne auf eure Hilfe zurückgreifen.

Ein wenig zum Projekt, welches ich realisieren möchte: Es geht darum, meine Heizung zu überwachen. Hierzu wollte ich per cronjob alle 20 Sekunden die Heizung abfragen um den aktuellen Zustand / Werte zu ermitteln. Alle 60 Minuten soll dann zusätzlich eine Abfrage erfolgen, bei welcher Werte ausgelesen werden, die sich selten ändern.

Das Skript für den cron (update.sh), welches alle 20 Sekunden ausgeführt werden soll, sieht so aus:

Code: Alles auswählen

if [ !$(pgrep vclient) ]
        then vclient -h localhost:3001 -f /opt/vcontrold/vc-commands.txt -t /opt/vcontrold/update.tmpl -x /opt/vcontrold/update.sh
fi
Die vc-commands.txt enthält eine Liste der Werte, welche abgefragt werden. Die zurückgelieferten Werte werden als Variablen in update.tmpl gespeichert.

Und ab diesem Punkt bin ich mit meinem Latein am Ende und mir stellen sich folgende Fragen:

1) Wie bekomme ich es hin, dass das Script update.sh alle 20 Sekunden ausgeführt wird? Der kürzeste cronjob ist ja leider 1 Minute.
2) Ist es möglich, nach einer Stunde Laufzeit dann das Script einmalig zu unterbrechen und genau einmal dann die andere Abfrage laufen zu lassen und danach wieder alle 20 Sekunden das andere zu starten?
3) Wie kann ich am besten die Rückgabewerte gleich in eine MySQL Datenbank schreiben?

Ich würde mich freuen, wenn ihr mir bei der Lösung helfen könnt und mir meine Debian DAU Fragen verzeiht.

An dieser Stelle bedanke ich mich auch schon bei allen Helfern und wünsche euch eine schönen 2. Advent.

LG
Andreas

Benutzeravatar
sbruder
Beiträge: 325
Registriert: 24.06.2016 13:54:36
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Wallmersbach

Re: Sekundengenauer cronjob

Beitrag von sbruder » 04.12.2016 13:50:12

Ich kann Dir nur zu 1 was sagen:

Code: Alles auswählen

*/1 * * * * sleep 0;MEIN BEFEHL
*/1 * * * * sleep 20;MEIN BEFEHL
*/1 * * * * sleep 40;MEIN BEFEHL

cosmac
Beiträge: 4551
Registriert: 28.03.2005 22:24:30

Re: Sekundengenauer cronjob

Beitrag von cosmac » 04.12.2016 14:09:56

hi,

1) cron ist dafür nicht gedacht, eher für Sachen, die einmal pro Stunde laufen. Ich würde ein Script schreiben das eine Endlosschleife enthält. In der Schleife wartet man, bis die Sekunden der Uhrzeit 0, 20 oder 40 sind und führt dann den Abfragebefehl aus -- fertig. Naja, fast. Wartet man tatsächlich im Sekundentakt auf die richtige Sekunde, ist das nicht nur uneffektiv, man kann auch den Zeitpunkt verpassen wenn der Rechner gut ausgelastet ist. Deshalb berechnet man die Zeit von "jetzt" bis zum Abfragezeitpunkt und macht ein entsprechend langes sleep(). Damit kann sich eine Abfrage zwar um mehrere Sekunden verschieben, geht aber nicht verloren. Das wäre mir für die langsame Abfrage wichtig.

2) zur vollen Stunde kommt einmal die langsame Abfrage dran, sonst die normale. Dazu kann man auch die Uhrzeit abfragen oder eine eine zweite Schleife einbauen, die 179 mal die normale Abfrage macht. Wenn diese zweite Schleife beendet ist, folgt der andere Abfragebefehl, dann beginnt das Spiel von vorn.

3) unter https://openv.wikispaces.com/vclient gibt es doch ein Beispiel für mysql?
Beware of programmers who carry screwdrivers.

scientific
Beiträge: 2701
Registriert: 03.11.2009 13:45:23
Lizenz eigener Beiträge: Artistic Lizenz
Kontaktdaten:

Re: Sekundengenauer cronjob

Beitrag von scientific » 04.12.2016 19:14:04

systemd timer ist das, was du suchst.
dann putze ich hier mal nur...

Eine Auswahl meiner Skripte und systemd-units.
https://github.com/xundeenergie

auch als Debian-Repo für Testing einbindbar:
deb http://debian.xundeenergie.at/xundeenergie testing main

letzter3
Beiträge: 258
Registriert: 16.07.2011 22:07:31

Re: Sekundengenauer cronjob

Beitrag von letzter3 » 04.12.2016 22:01:32

Als Ing. für Versorgungstechnik möchte ich (mal abgesehen davon, dass ich zur eigentlichen Problemlösung nichts beitragen kann) einen anderen, höheren Intervall anregen.
Ich weiss zwar nicht, welche Werte du genau aufzeichnen möchtest, aber würde mal vermuten:
- Aussentemperatur
- Raumtemperatur
- Vorlauftemperatur
- Rücklauftemperatur
- vielleicht noch Mischerstellung, Leistungsaufnahme der Pumpen, Durchflussmenge, WWB-Temperatur etc.

Der übliche Temperatur(anlege)sensor ist viel zu träge, um im 20 sec. Takt irgendwas vernünftiges auszugeben.
Der übliche Mischer benötigt für ein volles takloses Schliessen/Öffnen i.d.R 225 sec., wobei zwischen den einzelnen Takten, die im Heizbetrieb gefahren werden, deutlich mehr als 20 sec. vergehen.
Der klassische 1 (eine) Fühler im WW-Speicher ist bei einer Speichrehöhe von 1 m sowas von untauglich zum messen....

Im Industriebereich rechne ich im Wärmebereich mit 15-min-Werten in Anlehnung an die 15-min Taktung des Stromversorgers, auch wenn der Gas-/Wärmebreich nur im 1-Stunden-Rhythmus gemessen wird.

Bitte etwas mehr input! Da ich auch über eine Automatisierung nachdenke, interessiert mich das Thema!

OldGod78
Beiträge: 181
Registriert: 20.04.2016 20:59:51

Re: Sekundengenauer cronjob

Beitrag von OldGod78 » 06.12.2016 11:39:23

hmmm

Jana66
Beiträge: 2665
Registriert: 03.02.2016 12:41:11

Re: Sekundengenauer cronjob

Beitrag von Jana66 » 28.12.2016 10:44:45

letzter3 hat geschrieben:Im Industriebereich ... 15-min Taktung des Stromversorgers
Die Zaehlreihen der bei Industriekunden gemessenen Anschlussleistung bestehen dabei jedoch aus 15-min-Mittelwerten. Diese Mittelwerte werden vom Zähler gespeichert und vom Versorger abgefragt/verwendet. Weiss nicht, ob der TO irgendwelche Verbrauchsauswertungen machen möchte.

Der TO könnte auch eine gebrauchte SPS (Simatic) oder Logo! Kleinsteuerung in Erwägung ziehen. Gibt spezielle Karten (neben digitalen auch analoge Ein- und Ausgänge, Temperatur etc.). Des Weiteren sind neben zyklischem Polling auch einfach Interrupt Service Routinen möglich.
Wenn keiner was sagt, wird sich nichts ändern. Wenn alle nur reden ebenfalls nicht.

Antworten