#748 closed Verbesserung (erledigt)
Scripte in Ferien und an Feiertagen pausieren lassen
| Reported by: | bau | Owned by: | Rüdiger Kupper |
|---|---|---|---|
| Priority: | bei Gelegenheit | Milestone: | Schuljahr 2012/13 |
| Component: | Server: LML-Server (paedml) | Severity: | beeinträchtigt keinen Unterricht |
| Keywords: | Cc: |
Description
In den Ferien ist es immer wieder lästig, dass man die cronjobs von Scripten aus und anschließend wieder einschalten muss.
Vorschlag:
Wir legen eine Datei ferien z.B. nach /etc/ferien:
# Ferien und Feiertage an unserer Schule # Format: Beginndatum Endedatum # z.B. 03.10.2012 03.10.2012 03.10.2012 03.10.2012 27.10.2012 04.11.2012
und es gibt ein Script ferien.sh, welches das Script sofort tötet, wenn das aktuelle Datum innerhalb eines genannten Zeitraums liegt. Dann müssen wir nur irgendwann die Ferien eintragen und irgendwann wieder löschen und alles läuft ohne, dass wir z.B. am Freitag vor den Ferien dran denken müssen.
Change History (14)
comment:1 by , 14 years ago
| Owner: | changed from to |
|---|---|
| Status: | new → assigned |
comment:2 by , 14 years ago
comment:3 by , 14 years ago
Keine Ahnung, ich dachte du bist der bash-Crack :-)
Sowas hat aber bestimmt schonmal jemand anderes erledigt.
In PHP wäre das kein Problem zu erledigen. Also, wenn alle Stricke reißen, kann man ja ein PHP-Script aufrufen, das einen entsprechenden exit-code erzeugt.
comment:4 by , 14 years ago
| Status: | assigned → accepted |
|---|
- Spezifikation
- Es soll ein Skript namens "holiday" geben, das den Exitcode 0 (true) zurückgibt, wenn zur Zeit des Aufrufs ein Ferientag ist, sonst 1 (false). Dieses Skript wird in den betreffenden Cronskripten abgefragt.
Damit kann sich die Implementation über die Zeit ändern. Insbesondere lässt sich eine erste Implementation auf triviale Weise erstellen.
comment:5 by , 14 years ago
| Priority: | normal → gering |
|---|---|
| Severity: | normal → unkritisch |
Es existiert nun eine rudimentäre Implementation, die obige Spezifikation erfüllt, in /root/scripts/holiday. Die "wake"-Skripte wecken die Rechner jetzt in den Ferien nicht mehr auf.
Die Implementation von "holiday" muss noch verallgemeinert werden.
Siehe changeset:390/keplertools.
comment:6 by , 14 years ago
| Resolution: | → erledigt |
|---|---|
| Status: | accepted → closed |
Überarbeitete Version: changeset:392/keplertools.
- Programmtext kann noch aufgeräumt werden, Schalter und Dokumentation fehlen noch.
- Daten werden derzeit direkt im Skript eingetragen.
Habe die wichtigsten Ferien des Schuljahres eingetragen, bitte vervollständigen.
comment:8 by , 14 years ago
Tja, außer einem kleinen Fehlerchen bei der Abfrage des Rückgabewerts (Hab mich in der kryptischen Bash-Syntax vertan und die Ausgabe mit dem Rückgabewert verwechselt, siehe changeset:393/keplertools).
Das hat dazu geführt, dass heute morgen die Clients doch noch hochgefahren sind. Fahren gerade wieder herunter. Der Fehler ist jetzt behoben und morgen sollte es funktionieren.
comment:9 by , 14 years ago
Das holiday-Skript liest seine Daten nun aus der getrennten Datei /etc/holiday.
comment:10 by , 14 years ago
| Resolution: | erledigt |
|---|---|
| Status: | closed → reopened |
Das Script hat heute (erster Tag der Weihnachtsferien) alle Rechner angeschaltet, es gibt zunächst aus, dass Weihnachtsferien sind anschließend aber dass keine Ferien sind und endet folglich mit Exitcode 1. Ich habe mal zum Testen eine Variable JA eingefügt, diese funktioniert aber komischerweise in der Schleife nicht richtig! Damit das Ding morgen mal tut, habe ich JA=1 und den Emergency-Exit eingefügt.
comment:11 by , 14 years ago
Na sowas. Das hatte doch in den Sommerferien schon funktioniert? Ich schau mal danach.
comment:12 by , 14 years ago
| Resolution: | → erledigt |
|---|---|
| Status: | reopened → closed |
Mannomann, die Komplexität von Shellskripten haut mich immer wieder vom Hocker. Leider macht das die Shell-Programmierung auch so fehleranfällig. Vielleicht sollte ich doch mehr auf Python umsteigen, das ist nicht so kryptisch.
Hier ist folgendes passiert:
- Ursprünglich hatte ich die Feriendaten als "Here document" direkt ins Skript geschrieben (zwischen "<<EOF" und "EOF") und mit einer Schleife gelesen (vgl. Version source:keplertools/scripts/trunk/holiday@393)
- Dann hab ich die Feriendaten in ein eigenes File geschrieben, und stattdessen den Inhalt dieses Files in meine Schleife ge"pipe"t (vgl. Version source:keplertools/scripts/trunk/holiday@410)
Dabei ist mir entgangen, dass der "pipe"-Operator "|" in der Bash eine Subshell startet. Die gesamte Schleife lief also in einem Subprozess, und der "exit"-Befehl hat daher nicht das ganze Skript, sondern nur diese Subshell beendet. Das ist hier gut zusammengefasst: http://mywiki.wooledge.org/BashFAQ/024
Der Fehler ist mir damals nicht aufgefallen, weil gerade keine Ferien waren, als ich das neue Skript getestet habe, und da funktioniert es!
Jetzt nutze ich "Prozess-Substitution", da läuft nur die Auswertung der Datei als Subprozess, die Schleife bleibt Teil des Hauptprozesses. Siehe http://www.gnu.org/software/bash/manual/bashref.html#Process-Substitution.
Ts, was für ein perfider Fehler; ich frage mich, ob es jemanden gibt, der die Bash wirklich durchschaut ;-)
comment:13 by , 14 years ago
Ich dachte mir schon so etwas, da die von mir eingefügte Variable trotz Setzen auf 1 keine Auswirkung hatte. Ich finde es trotzdem immer wieder spannend, was man da bei der Arbeit so alles lernen kann. Bislang war die Bash für mich ein Buch mit mehreren Siegeln, allerdings auch eine Fundgrube bei der man nur googeln muss und schon findet sich eine Lösung jedes Problems - einfach fantastisch. Nur leider haben wir halt wegen des vielen Unterrichts immer wieder zu wenig Zeit :-(
comment:14 by , 14 years ago
Tja, vor allem ist mir beim Lesen aufgefallen, dass ich das mit den Subprozessen auch schonmal wusste...
Klingt machbar. Wie vergleicht man in der Bash Daten miteinander? Kann das der date-Befehl?