Project

General

Profile

de|en

croncheck

Dieser shutdown-hook verhindert das sich der VDR beendet, während gerade cronjobs aktiv sind.

Installation

Die Installation erfolgt folgendermaßen.
  • Folgendes Script export:shutdown-hooks/croncheck/croncheck unter /usb/bin speichern und per chmod +x /usr/bin/croncheck Ausführrechte geben.
  • Im shutdown-hook Verzeichnis mit ln -s /usr/bin/croncheck /etc/vdr/shutdown-hooks/S10.croncheck einen Link auf dieses Script anlegen.
  • In den zu schützenden cron Part-Verzeichnis Start-/Stoplinks mit ln -s /usr/bin/croncheck /etc/cron.????/00000_croncheck und ln -s /usr/bin/croncheck /etc/cron.????/zzzzz_croncheck erstellen.
    ???? ist dabei durch daily, hourly, weekly oder monthly zu ersetzen, je nachdem welche Jobs man berücksichtigen möchte.
  • In Einträgen einer crontab werden Start-/Stopbefehle in der Form croncheck start|stop <id> vor und nach dem eigentliche Befehl eingefügt.
    So wird z.B. aus
    # Look for and purge old sessions every 30 minutes
    09,39 *     * * *     root   [ -x /usr/lib/php5/maxlifetime ] && [ -d /var/lib/php5 ] && find /var/lib/php5/ -type f -cmin +$(/usr/lib/php5/maxlifetime) -delete

    folgendes
    # Look for and purge old sessions every 30 minutes
    09,39 *     * * *     root   croncheck start "php purge"; [ -x /usr/lib/php5/maxlifetime ] && [ -d /var/lib/php5 ] && find /var/lib/php5/ -type f -cmin +$(/usr/lib/php5/maxlifetime) -delete; croncheck stop "php purge"

    Die <id> muss dabei eindeutig sein.
  • Optional kann noch ein Befehl erzeugt werden, der es ermöglicht den shutdown manuell zu unterbinden. Dazu per ln -s /usr/bin/croncheck /usr/bin/vdrps den Befehl vdrps installieren.
  • Die Sprachdatei mit msgfmt -o /usr/share/locale/de_DE/LC_MESSAGES/croncheck.mo ./po/de_DE.po instalieren.
  • croncheck init mit root Rechten ausführen
  • Optional einen Eintrag in die VDR commands.conf hinzufügen der es erlaubt den shutdown manuell zu dekativieren.
    In der commands.conf ist hierfür folgendes einzutragen
    -Shutdown Kontrolle : /usr/bin/croncheck osdserver

    Soll dafür das osdserver Plugin genutzt werden und der osdserver Port weicht vom Default (2010) ab muss der /etc/services folgende Zeile hinzugefügt werden (Also Beispiel für Port 6400)
    vdr-osdserver    6400/tcp

Funktionsweise

In den Part-Verzeichnissen wird 00000_croncheck aufgrund des Dateinamens als erstes ausgeführt und erstellt in /var/spool/cronceck eine Flagdatei. zzzzz_croncheck wird als letzter Job ausgeführt und löscht diese Flagdatei wieder.
In einer crontab hat der start/stop Befehl den selben Effekt.

Der shutdown-hook prüft auf das Vorhandensein dieser Flagdateien in /var/spool/cronceck und verhindert den shutdown sofern mindestens eine vorhanden ist.
So ist sichergestellt das der shutdown solange verzögert wird, wie noch Jobs aktiv sind.

Zur Sicherheit werden Flagdateien älter als 60 Minuten nicht berücksichtigt. So wird ein hängender Job den VDR nicht unendlich lange aktiv halten.

Mittels vdrps start|stop [<id>] lässt sich der shutdown manuell unterbinden. Das kann nützlich sein wenn man manuell längere Prozesse anstößt (z.B. ein Kernelbau oder der Upload einer größeren Datei). Die optionale <id> kann genutzt werden wenn mehrere Prozesse angestoßen werden sollen.
Hierbei findet keine Prüfung auf ein max. alter von 60 Minuten statt. Der VDR wird solange an bleiben bis alle stop Befehle aufgerufen wurden.
Genutzt wird es z.B. folgendermaßen
vdrps start "kernel"; make-kpkg kernel_image -j 5; vdrps stop "kernel"
oder, wenn nur ein einzelner Prozess gestartet wird
vdrps start; make-kpkg kernel_image -j 5; vdrps stop

Benötigte Software