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
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
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.
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
Aus einem Grund: Ich kannte at nicht. Danke für den Hinweis.
I used that in my script. Thank you, its working great ;)