nvjob:start

Rechnerstart für Cronjobs

Vornehmste Aufgabe eines Linuxrechners ist es den täglichen Kleinkram wie Backups völlig selbstständig zu übernehmen. Für diese Aufgaben ist der Cron-Dämon zuständig, der Programme oder Scripte (Jobs) zu einem vorgegebenen Datum startet. Etwas dumm daran ist nur, dass der Rechner zu diesem Zeitpunkt auch eingeschaltet sein muss. Es gibt zwar es das Programm Anacron, das die von ihm verwalteten Jobs nachholt, falls später der Rechner gestartet wird. Aber nicht immer ist dies sinnvoll oder möglich.

Die folgend vorgestellten Scripte starten den Rechner um dann Programme oder Scripte per Cron auszuführen.

Voraussetzungen

Die Scripte setzen eine Basis-Installation von Debian-System 6.0 (Squeeze) voraus.

Weiterhin wird sudo benötigt, da das Script zum Herunterfahren des Rechners als Root ausgeführt werden muss. Wer das noch nicht installiert hat, sollte das jetzt tun:

# aptitude install sudo

Um die nächste Start-Zeit aus den Crontabs auszulesen und das Datum zu berechnen werden die Perl-Module Config::Crontab, Set::Crontab und Date::Calc benötigt.

Date::Calc und Set::Crontab sind standardmäßig in Debian enthalten und können daher mit aptitude installiert werden:

# aptitude install libdate-calc-perl libset-crontab-perl

Das Modul Config::Crontab ist nicht in Debian enthalten, sondern muss von CPAN heruntergeladen, in ein Debian-Paket verpackt und installiert werden. Das Programm dh-make-perl automatisiert diesen Prozess weitgehend. Um dh-make-perl Ausführen zu können muss es erstmal installiert sein:

# aptitude install dh-make-perl

Das Bauen des Debian-Pakets sollte man nicht als root ausführen:

$ dh-make-perl -build -cpan Config::Crontab

Das nun gebaute Paket installieren:

# dpkg -i libconfig-crontab-perl_1.33-1_all.deb

Download und Installation

Die Scripte erwarten, über den Pfad “/usr/local/“ aufgerufen zu werden. Im einfachsten Fall entpackt man Sie einfach dort hin:

# tar xzvf nvstart.tgz -C /usr/local/

Wer (wie ich) sein /usr/local-Verzeichnis lieber mit stow verwaltet:

# mkdir -p /usr/local/stow/nvstart
# tar xzvf nvstart.tgz -C /usr/local/stow/nvstart/
# cd /usr/local/stow/
# stow nvstart/

Zeitgesteuerter Rechnerstart

Dass der Rechner zur einer bestimmten Zeit startet braucht es eine Zeitschaltuhr. Eine solche ist so ziemlich in jedem Rechner standardmäßig eingebaut. Diese Funktion nennt man ACPI-Wakeup. Das Script “rtcwakeup.pl“ programmiert diese Zeitschaltuhr anhand der übergebenen Uhrzeit.

Bei einfachen Aufruf gibt das Programm eine kurze Hilfe aus:

# rtcwakeup.pl 
Set or Disable the ACPI wakeup time.

./rtcwakeup.pl [-fromnow] [-test] [time] 
-fromnow:   <time> is seconds from now
-fromepoch: <time> is seconds from epoch (default)
-test:      do nothing, but output
time:       time in seconds or 0 (default) to disable

Dieser Befahl startet den Rechner in 5 Minuten:

# /usr/local/bin/rtcwakeup -fromnow 300

Links:

Automatisches Abschalten

Damit am Ende des Cronjobs des Rechner wieder heruntergefahren wird ist folgender Eintrag in die Datei /etc/sudoers notwendig:

%nvwakeup ALL  = NOPASSWD: /bin/bash /usr/local/bin/nvshutdown

Um diese Zeile in die Datei /etc/sudoers einzutragen verwendet man den Befehl sudoedit:

# sudoedit /etc/sudoers

Das Script nvshutdown fährt den Rechner am Ende des Cronjobs nur herunter, wenn

  1. kein (menschlicher) Benutzer eingeloggt ist.
  2. kein weiterer nvjob läuft
  3. ein solcher auch nicht in den nächsten Minuten gestartet wird.

Definition des Cron-Jobs

Das Script nvstart durchsucht die Benutzercrontabs der Benutzergruppe nvwakeup nach dem Programm nvjob. Das ist ein Wrapper, der das eigentliche zu startende Programm aufruft, welches als Parameter übergeben wird. Danach ruft es über sudo das Skript nvshutdown auf, um den rechner heruterzufahren.

Als Beispiel wird nun ein montäglicher Backupjob definiert.

Zunächst muss die Benutzergruppe nvwakeup angelegt werden und der Benutzer root, der das Backup ausführt in diese Benutzergruppe aufgenommen werden:

# addgroup nvwakeup
# adduser root nvwakeup

Nun editiert root seine Benutzercrontab:

# crontab -e

Durch Anpassen der PATH-Variable stellt er sicher, dass die Scripte aufgerufen werden können, dann definiert er den Backup-Job:

PATH=/root/scripts:/root/bin:/bin:/sbin:/usr/bin/:/usr/sbin:/usr/local/bin

30  8  *  *  1 nvjob /root/scripts/backup.sh backup

Dieser Cronjob sollte nun erkannt werden:

# /usr/local/bin/nvstart.pl print
nvstart.pl: read root's crontab ...
nvstart.pl: Jobstart at 19-Mar-2012 08:30:00 noticed.
nvstart.pl: Next nvjob cronjob is at 19-Mar-2012 08:30:00

Automatischer Aufruf

Das Script nvstart.pl sollte nun vor jedem Herunterfahren aufgerufen werden um die Zeitschaltuhr auf den nächsten Termin zu programmieren. Dazu ist das Init-Script /etc/init.d/nvstart mit folgenden Inhalt notwendig:

Click to display ⇲

Click to hide ⇱

Click to hide ⇱

#! /bin/sh
### BEGIN INIT INFO
# Provides:          nvstart
# Required-Start:
# Required-Stop:     $all
# Default-Start:
# Default-Stop:      0 6
# Short-Description: Setzt den Wecker beim herunterfahren
# Description:       Setzt den Wecker beim herunterfahren
#
### END INIT INFO
 
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
NAME=nvstart
PERL=/usr/bin/perl
SCRIPT=/usr/local/bin/nvstart.pl
 
test -x $PERL || exit 0
test -x $SCRIPT || exit 0
 
set -e
 
case "$1" in
  stop)
        echo "Setting Alarmtime: nvstart"
        $PERL $SCRIPT set
        ;;
  *)
        N=/etc/init.d/$NAME
        echo "Usage: $N stop" >&2
        exit 1
        ;;
esac
 
exit 0

Nachdem man den Inhalt des Init-Scripts in die Datei /etc/init.d/nvstart übertragen hat. Macht man diese ausführbar und installiert es dann:

chmod a+x /etc/init.d/nvstart
insserv nvstart
nvjob/start.txt · Zuletzt geändert: 2014/09/13 19:12 (Externe Bearbeitung)

Seiten-Werkzeuge