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.