close Warning: Can't synchronize with repository "keplertools" (/srv/svn/keplertools does not appear to be a Subversion repository.). Look in the Trac log for more information.

Opened 14 years ago

Closed 14 years ago

Last modified 14 years ago

#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 bau, 14 years ago

Owner: changed from bau to Rüdiger Kupper
Status: new → assigned

comment:2 by Rüdiger Kupper, 14 years ago

Klingt machbar. Wie vergleicht man in der Bash Daten miteinander? Kann das der date-Befehl?

comment:3 by bau, 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 Rüdiger Kupper, 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 Rüdiger Kupper, 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 Rüdiger Kupper, 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:7 by bau, 14 years ago

Geil - gute Arbeit!

comment:8 by Rüdiger Kupper, 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.

Last edited 14 years ago by Rüdiger Kupper (previous) (diff)

comment:9 by Rüdiger Kupper, 14 years ago

Das holiday-Skript liest seine Daten nun aus der getrennten Datei /etc/holiday.

comment:10 by bau, 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 Rüdiger Kupper, 14 years ago

Na sowas. Das hatte doch in den Sommerferien schon funktioniert? Ich schau mal danach.

comment:12 by Rüdiger Kupper, 14 years ago

Resolution: → erledigt
Status: reopened → closed

Mannomann, die Komplexität von Shell Skripts 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:

Dabei ist mir entgangen, dass der "pipe"-Operator "|" in der Bash eine Subshell startet. Die gesamte Schleife lief also in 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 ;-)

Version 0, edited 14 years ago by Rüdiger Kupper (next)

comment:13 by bau, 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 Rüdiger Kupper, 14 years ago

Tja, vor allem ist mir beim Lesen aufgefallen, dass ich das mit den Subprozessen auch schonmal wusste...

Note: See TracTickets for help on using tickets.