Bash-Script um zeitgesteuert Programme zu starten

Wenn man beispielsweise heute um 20:15 Uhr ein bestimmtes Script starten möchte, kommt man meist um ein Crontab nicht herum. Mit diesem kleinen Script übergibt man als Parameter ein Datum und/oder Uhrzeit und das Script wartet dann bis zu diesem Zeitstempel, bevor das Script beendet wird und das darauf folgende Programm gestartet wird – somit spart man sich das aufwändige editieren der Crontab-Files.

Beispiel

Uhrzeit:

root@test:~$ ./tsleep.sh 14:30; reboot
i sleep until 2009-12-12 14:30:00 ...

Datum:

./tsleep.sh 2009-12-24; reboot
i sleep until 2009-12-24 00:00:00 ...

Datum mit Uhrzeit:

root@test:~$ ./tsleep.sh 2009-12-24 13:45:12; reboot
i sleep until 2009-12-24 13:45:12 ...

Funktionsweise

Der Zeitstempel wird in Sekunden umgerechnet und über eine while-Schleife sekündlich mit dem aktuellen Datum abgeprüft. Ist das aktuelle Datum gleich oder älter dem Zeitstempel, wird das Script beendet und das darauf folgende Program gestartet. Als Zeitstempel kann man alles verwenden was date futtert.

Eine alternative wäre die Differenz der aktuellen Zeit und des Zeitstempels in Sekunden umzurechnen und dann sleep zu übergeben. Ob das perfomanter ist – keine Ahnung, mein Script dagegen überlebt auch Zeit-Anpassungen (z.b. rdate/ntpdate), daher habe ich diesen Weg gewählt.

Sollte jemand Fehler finden oder das Script verbessern, würde ich mich freuen, wenn Ihr mir das mitteilt ;).

Script

#!/bin/bash
 
if [[ -z "$1" ]]; then
        echo "Usage: $0 <timestamp>" >&2
        exit 1
elif [[ -z "$2" ]]; then
        date="$1"
else
        date="$1 $2"
fi
 
date_end=$(date --date="$date" +%s 2>/dev/null);
 
if [[ ! $? -eq 0 ]]; then
        echo "error: invalid date" 2>&1
        exit 1
fi
 
if [[ $date_end -le $(date +%s) ]]; then
        echo "error: end time is lower or eqal start time" >&2
        exit 1
fi
 
echo "i sleep until $(date --date="$date" "+%Y-%m-%d %H:%M:%S") ..."
 
while [[ $(date +%s) -le $date_end ]]; do
        sleep 1
done
 
exit 0

Download

Download tsleep.sh

wget http://blog.kevin-k.com/wp-content/uploads/2009/12/tsleep.sh
chmod +x tsleep.sh

at

Alternativ gibt es auch at, das Befehle direkt von Standard-Input oder einer Datei ließt und zu einer bestimmten Uhrzeit ausführt.

3 Kommentara zu “Bash-Script um zeitgesteuert Programme zu starten“

  1. Wieso das Rad neu erfinden?

    % apt-cache show at
    Description: Delayed job execution and batch processing
    At and batch read shell commands from standard input
    storing them as a job to be scheduled for execution in the
    future.
    .
    Use
    at to run the job at a specified time
    batch to run the job when system load levels permit

  2. kevin sagt:

    Aus einem Grund: Ich kannte at nicht. Danke für den Hinweis.

  3. Angry sagt:

    I used that in my script. Thank you, its working great ;)

Hinterlasse eine Antwort

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *

*

Du kannst folgende HTML-Tags benutzen: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="" highlight="">