CRON-Dienst: Unterschied zwischen den Versionen

Aus Ethersex_Wiki
Wechseln zu: Navigation, Suche
(Dynamischer Cron Daemon)
 
(10 dazwischenliegende Versionen von 3 Benutzern werden nicht angezeigt)
Zeile 3: Zeile 3:
 
Cronjobs sind auf zweifache Weise in Ethersex implementiert. Eine statische Liste, die zur Compilierzeit bestimmt werden muss und danach auch nicht mehr beeinflusst werden kann und einen dynamischen Ansatz, bei dem die Jobs beim Start von Ethersex in den Ram geladen werden. Danach können nach belieben Jobs entfernt und hinzugefügt werden.
 
Cronjobs sind auf zweifache Weise in Ethersex implementiert. Eine statische Liste, die zur Compilierzeit bestimmt werden muss und danach auch nicht mehr beeinflusst werden kann und einen dynamischen Ansatz, bei dem die Jobs beim Start von Ethersex in den Ram geladen werden. Danach können nach belieben Jobs entfernt und hinzugefügt werden.
  
== Voraussetungen ==
+
== Voraussetzungen ==
Beide Ansätze haben gemeinsam, dass du erst einmal eine Funktion definieren musst, welche vom Cron daemon zum bestimmten Zeitpunkt aufgerufen werden kann. Die Funktionssignatur sieht allerdings abhängig davon welche Implementierung du wählst, leicht anders aus.
+
Beide Ansätze haben gemeinsam, dass du erst einmal eine Funktion definieren musst, welche vom Cron daemon zum bestimmten Zeitpunkt aufgerufen werden kann. Die Funktionssignatur sieht allerdings, abhängig davon welche Implementierung du wählst, leicht anders aus.
  
 
== Menuconfig ==
 
== Menuconfig ==
Zeile 14: Zeile 14:
 
   │ │                Applications  --->
 
   │ │                Applications  --->
 
   │ │                  ...
 
   │ │                  ...
   │ │                  [*] System clock support  --->
+
   │ │                  [*] Cron daemon --->
   │ │                       [*] Cron daemon
+
   │ │                 [ ] Cron daemon (static jobs)
  │ │                        [ ] Cron daemon (static jobs)
 
 
 
  
 
== Statischer Cron Daemon ==
 
== Statischer Cron Daemon ==
Zeile 41: Zeile 39:
  
 
=== Hinzufügen per ecmd ===
 
=== Hinzufügen per ecmd ===
Jedes Modul muss dafür einen eigenen Befehl implementieren. Stella hat dafür beispielsweise '''[[Stella_Light#stella_cron|stella cron]]'''.
+
'''cron_add MIN HOUR DAY MONTH DAYOFWEEK ECMD'''
 +
 
 +
MIN HOUR DAY MONTH und DAYOFWEEK können -1 (als Platzhalterfunktion) annehmen.
 +
 
 +
ECMD: Der ecmd Befehl, der ausgeführt werden soll.
 +
 
 +
=== Job als persistent markieren per ecmd ===
 +
'''cron_make_persistent N''' macht den Nten Job persistent
 +
 
 +
=== Persistente Jobs in VFS schreiben per ecmd ===
 +
'''cron_save''' alle als persistent markierten Jobs werden im VFS abgespeichert
 +
 
 +
 
 +
 
 +
=== Cronjob im Quelltext definieren: Callback Funktion ===
 +
Wer scharf hinsieht, erkennt, dass diese Funktionalität auch durch den statischen Cron Daemon abgedeckt wird.
 +
Der statische Dienst verbraucht dabei sogar weniger Ressourcen. Aber, hier die Vorteile des dynamischen Dienstes:
 +
 
 +
* Du musst keinen Quelltext in ein fremdes Modul einfügen (Übersichtlichkeit der cron_static.c nimmt mit jedem weiterem Modul ab)
 +
* Du kannst zur Laufzeit den cronjob auch wieder entfernen.
 +
* Du kannst Extradaten an die Callback Funktion übergeben
  
=== Von deinem Modul aus aufrufen ===
 
 
Die Funktion, welche der Daemon aufrufen soll, muss folgende Signatur haben
 
Die Funktion, welche der Daemon aufrufen soll, muss folgende Signatur haben
 
'''void func(char* data)''' und sollte ''nicht'' in der cron/cron.c Datei definiert werden, sondern in dem jeweiligen Modul, welche die Cron Funktionalität nutzen will.
 
'''void func(char* data)''' und sollte ''nicht'' in der cron/cron.c Datei definiert werden, sondern in dem jeweiligen Modul, welche die Cron Funktionalität nutzen will.
  
Binde in dein Modul die Datei 'cron/cron.h' ein.
+
# Binde in dein Modul die Datei 'cron/cron.h' ein.
 
+
# Nutze die Callback Variante des Cron-Einfügen Befehls '''cron_jobinsert_callback''' in der Initalisierungsfunktion deines Moduls um beim Start von ethersex cronjobs hinzuzufügen.
Nutze die Callback Variante des Cron-Einfügen Befehls '''cron_jobinsert_cb''' in der Initalisierungsfunktion deines Moduls um beim Start von ethersex cronjobs hinzuzufügen. Folgende Paramater musst du angeben:
+
# Die Funktionsparameter haben die folgende Semantik:
 
* Minute, -1 für ignorieren, -2 für jede 2te Minute etc
 
* Minute, -1 für ignorieren, -2 für jede 2te Minute etc
 
* Stunde, -1 für ignorieren, -2 für jede 2te Stunde etc
 
* Stunde, -1 für ignorieren, -2 für jede 2te Stunde etc
 
* Tag, -1 für ignorieren, -2 für jeden 2te Tag etc
 
* Tag, -1 für ignorieren, -2 für jeden 2te Tag etc
 
* Monat, -1 für ignorieren, -2 für jeden 2te Monat etc
 
* Monat, -1 für ignorieren, -2 für jeden 2te Monat etc
* Wochentag, -1 für ignorieren, 0=Sonntag, 1=Montag etc
+
* Wochentag, 1 für Sonntag, 2 für Montag, 4 für Dienstag, 8 für Mittwoch, 16 für Donnerstag, 32 für Freitag, 64 für Samstag oder eine Addition daraus
 
* Wiederholen, INFINIT_RUNNING für endlos, 1=einmal etc
 
* Wiederholen, INFINIT_RUNNING für endlos, 1=einmal etc
 
* Position des Crons in der Cronliste (CRON_APPEND, wenn angehängt werden soll)
 
* Position des Crons in der Cronliste (CRON_APPEND, wenn angehängt werden soll)
Zeile 64: Zeile 81:
 
  void test(void* data) { /* tu was */ }
 
  void test(void* data) { /* tu was */ }
 
  // in init
 
  // in init
  cron_jobinsert_cb(-1, -2, -1, -1, -1, INFINIT_RUNNING, CRON_APPEND, test, 0, NULL);
+
  cron_jobinsert_callback(-1, -2, -1, -1, -1, INFINIT_RUNNING, CRON_APPEND, test, 0, NULL);
  
 
Extradaten sind eine ziemlich coole Sache. Stella PWM zum Beispiel speichert darin Lichtkanal und Zielwert. Beim Aktivieren des Cronjobs wird der Zeiger auf diese Extradaten dann an die Callback Funktion mit übergeben und diese stehen direkt zur Verfügung.
 
Extradaten sind eine ziemlich coole Sache. Stella PWM zum Beispiel speichert darin Lichtkanal und Zielwert. Beim Aktivieren des Cronjobs wird der Zeiger auf diese Extradaten dann an die Callback Funktion mit übergeben und diese stehen direkt zur Verfügung.
Zeile 71: Zeile 88:
 
Du musst und solltest dich nicht um die Freigabe des allokierten Speichers kümmern. Dies erledigt der Cron daemon bereits.
 
Du musst und solltest dich nicht um die Freigabe des allokierten Speichers kümmern. Dies erledigt der Cron daemon bereits.
  
=== Vordefinierte Cron Callbacks ===
+
=== Cronjob im Quelltext definieren: Ecmd aufrufen ===
Wenn du das Modul "[[ecmd speed protocol]]" aktivierst, wird dieses zur Interpretation der Crondaten verwendet. Damit musst du keine Callback Funktionen definieren für Funktionalität die bereits durch den ecmd speed parser abgedeckt wird (z.B. Pins setzen, Stella PWM kontrollieren, ethersex reseten etc).
+
Der statische cron daemon bot die Möglichkeit eine Funktion zu gegebenem Zeitpunkt aufzurufen. Wenn du jedoch
 +
den dynamischen Dienst nutzt, kannst du auch ecmd Befehle zeitabhängig aufrufen lassen
 +
(z.B. Pins setzen, Stella PWM kontrollieren, ethersex reseten etc).
 +
 
 +
Die Funktion die du in dein Modul hierfür einbauen musst, lautet folgendermaßen:
 +
 
 +
cron_jobinsert_ecmd(-1, -2, -1, -1, 127, INFINIT_RUNNING, CRON_APPEND, "ECMD");
  
Ein Beispiel um mit einem Crontab den Pin 3 des Ports B um 12:00h jeden Tag zu aktivieren:
 
* In deiner Datei die benötigten Header einbinden:
 
#include "services/cron/cron.h"
 
#include "protocols/emcd/speed_parser.h"
 
* Die Kommandosequenz für den Parser zusammenstellen:
 
char* seq = malloc(4);
 
seq[0] = ECMDS_SET_PORTPIN;
 
seq[1] = 1; //Port B
 
seq[2] = 2; //Pin2
 
seq[3] = 1; //Pin einschalten (=1)
 
* Cron einbinden
 
cron_jobinsert(0, 12, -1, -1, -1, INFINIT_RUNNING, CRON_APPEND, 4, seq);
 
  
 
[[Category:Ethersex]]
 
[[Category:Ethersex]]

Aktuelle Version vom 15. Juni 2010, 16:15 Uhr

Der Cron daemon verwaltet so genannte cron jobs. Diese Regeln definieren bestimmte immer wiederkehrende oder einmalige Zeitpunkte zu denen dann Kommandos ausgeführt werden können.

Cronjobs sind auf zweifache Weise in Ethersex implementiert. Eine statische Liste, die zur Compilierzeit bestimmt werden muss und danach auch nicht mehr beeinflusst werden kann und einen dynamischen Ansatz, bei dem die Jobs beim Start von Ethersex in den Ram geladen werden. Danach können nach belieben Jobs entfernt und hinzugefügt werden.

Voraussetzungen

Beide Ansätze haben gemeinsam, dass du erst einmal eine Funktion definieren musst, welche vom Cron daemon zum bestimmten Zeitpunkt aufgerufen werden kann. Die Funktionssignatur sieht allerdings, abhängig davon welche Implementierung du wählst, leicht anders aus.

Menuconfig

Das Modul benötigt allerdings die aktuelle Zeit um richtig funktionieren zu können. Du musst daher im selben Untermenü mindestens eine Zeitquelle ebenfalls einschalten. Um Crontabs in ethersex zu aktivieren, wählt man im Menü

 │ │                Load a Default Configuration  --->
 │ │                ...
 │ │                Applications  --->
 │ │                  ...
 │ │                  [*] Cron daemon --->
 │ │                  [ ] Cron daemon (static jobs)

Statischer Cron Daemon

Die Funktion, welche der Daemon aufrufen soll, muss folgende Signatur haben void func(void) und muss direkt in cron_static/cron_static.c definiert werden.

Es muss dann nur noch eine Regel in die Array Struktur events vom Typ cron_static_event_t eingefügt werden. Die Werte der Reihenfolge nach stehen für Minute, Stunde, Tag, Monat, Wochentag, Callback Funktion und ob UTC oder die lokale Zeitzone benutzt werden soll.

Eine -1 steht für einen Platzhalter. Da die Einträge ca. jede Minute einmal geprüft werden, wird also ein Eintrag mit nur Platzhalter Werten auch ca. jede Minute ausgeführt.

Werte unter -1 haben die Bedeutung von "jede x-te Minute/Stunde/etc". Also ein Wert von -4 an der Minutenstelle bedeutet, dass der Crontab jede 4te Minute ausgeführt wird.

Dynamischer Cron Daemon

Auslesen per ecmd

Einfach den ecmd Befehl cron_list zum Beispiel in deinem Browser ausführen. Dann werden dir die Anzahl der aktuellen Cronjobs angezeigt. Jetzt kannst du cron_list N eingeben, wobei du N durch eine Zahl zwischen 0 und Anzahl der Jobs-1 ersetzen solltest. Nun werden dir alle Details zu diesem Job angezeigt.

Entfernen per ecmd

cron_rm N entfernt den Nten Job (fängt bei 0 an zu zählen) aus der cron Liste. Vorsicht! cron_rm ohne Parameter entfernt ALLE cron jobs, und das ohne vorher nachzufragen!

Hinzufügen per ecmd

cron_add MIN HOUR DAY MONTH DAYOFWEEK ECMD

MIN HOUR DAY MONTH und DAYOFWEEK können -1 (als Platzhalterfunktion) annehmen.

ECMD: Der ecmd Befehl, der ausgeführt werden soll.

Job als persistent markieren per ecmd

cron_make_persistent N macht den Nten Job persistent

Persistente Jobs in VFS schreiben per ecmd

cron_save alle als persistent markierten Jobs werden im VFS abgespeichert


Cronjob im Quelltext definieren: Callback Funktion

Wer scharf hinsieht, erkennt, dass diese Funktionalität auch durch den statischen Cron Daemon abgedeckt wird. Der statische Dienst verbraucht dabei sogar weniger Ressourcen. Aber, hier die Vorteile des dynamischen Dienstes:

  • Du musst keinen Quelltext in ein fremdes Modul einfügen (Übersichtlichkeit der cron_static.c nimmt mit jedem weiterem Modul ab)
  • Du kannst zur Laufzeit den cronjob auch wieder entfernen.
  • Du kannst Extradaten an die Callback Funktion übergeben

Die Funktion, welche der Daemon aufrufen soll, muss folgende Signatur haben void func(char* data) und sollte nicht in der cron/cron.c Datei definiert werden, sondern in dem jeweiligen Modul, welche die Cron Funktionalität nutzen will.

  1. Binde in dein Modul die Datei 'cron/cron.h' ein.
  2. Nutze die Callback Variante des Cron-Einfügen Befehls cron_jobinsert_callback in der Initalisierungsfunktion deines Moduls um beim Start von ethersex cronjobs hinzuzufügen.
  3. Die Funktionsparameter haben die folgende Semantik:
  • Minute, -1 für ignorieren, -2 für jede 2te Minute etc
  • Stunde, -1 für ignorieren, -2 für jede 2te Stunde etc
  • Tag, -1 für ignorieren, -2 für jeden 2te Tag etc
  • Monat, -1 für ignorieren, -2 für jeden 2te Monat etc
  • Wochentag, 1 für Sonntag, 2 für Montag, 4 für Dienstag, 8 für Mittwoch, 16 für Donnerstag, 32 für Freitag, 64 für Samstag oder eine Addition daraus
  • Wiederholen, INFINIT_RUNNING für endlos, 1=einmal etc
  • Position des Crons in der Cronliste (CRON_APPEND, wenn angehängt werden soll)
  • Callback Funktion
  • Größe von Extradaten
  • Extradaten

Beispiel aus der Test Einträge Datei:

void test(void* data) { /* tu was */ }
// in init
cron_jobinsert_callback(-1, -2, -1, -1, -1, INFINIT_RUNNING, CRON_APPEND, test, 0, NULL);

Extradaten sind eine ziemlich coole Sache. Stella PWM zum Beispiel speichert darin Lichtkanal und Zielwert. Beim Aktivieren des Cronjobs wird der Zeiger auf diese Extradaten dann an die Callback Funktion mit übergeben und diese stehen direkt zur Verfügung. Bitte beachte hierbei aber, dass der Pointer auf die Extradaten durch einen Malloc Aufruf gewonnen werden muss, sprich die Speicherstelle für die Extradaten müssen vorher auf dem Heap allokiert werden. (Beispiel: char* extra = malloc(2); für 2 Bytes auf dem Heap)

Du musst und solltest dich nicht um die Freigabe des allokierten Speichers kümmern. Dies erledigt der Cron daemon bereits.

Cronjob im Quelltext definieren: Ecmd aufrufen

Der statische cron daemon bot die Möglichkeit eine Funktion zu gegebenem Zeitpunkt aufzurufen. Wenn du jedoch den dynamischen Dienst nutzt, kannst du auch ecmd Befehle zeitabhängig aufrufen lassen (z.B. Pins setzen, Stella PWM kontrollieren, ethersex reseten etc).

Die Funktion die du in dein Modul hierfür einbauen musst, lautet folgendermaßen:

cron_jobinsert_ecmd(-1, -2, -1, -1, 127, INFINIT_RUNNING, CRON_APPEND, "ECMD");