#!/bin/bash # Zweck: Einen bestimmten Befehl wieder und wieder probieren, bis # er Erfolg hat. Danach aus der Warteschlange loeschen. # # Ich benutze das vor allem als Downloader. Beispiel: # retry wget -c --limit-rate=20k http://ftp.sunet.se/pub/tv+movies/warriors/warriors-700-de-VBR.mpg # # 'retry' ohne argumente nimmt alle unterbrochenen jobs wieder auf. set -e # Verzeichnis mit der Warteschlange qdir=$HOME/.retryq [ -d $qdir ] || mkdir $qdir if [ $# -eq 0 ] ; then echo "Warteschlange ($qdir):" list=$(ls $qdir/*.sh 2>/dev/null) echo "$list" if [ -r $qdir/lock ] ; then pid=$(cat $qdir/lock) if ps -p $pid | grep retry >/dev/null 2>&1 ; then echo "Ein anderer Prozess (PID $pid) laeuft bereits!" exit 1 else echo "Entferne veraltetes $qdir/lock" rm $qdir/lock fi fi echo "--- queue-run (alles auf einmal) ---" trap 'echo trap; rm -f $qdir/lock; exit 2' TERM INT echo -n $$ > $qdir/lock for i in $list ; do (bash $i && rm $i && echo "$i erfolgreich - job gelöscht.") & done # warten, bis alle fertig sind wait rm -f $qdir/lock exit 0 else if [ "x$@" = "x--help" ] || [ "x$@" = "x-h" ] ; then echo "$(basename $0) [Befehl]" echo "Wenn kein Befehl angegeben wurde, wird die Warteschlange abgearbeitet." echo "Wenn der Befehl »-« ist, wird von Standardeingabe gelesen." exit 0 fi (( i = 1 )) while [ -r $qdir/$i.sh ] ; do (( i = i + 1 )) done echo "Die Befehle werdem von $(which bash) abgearbeitet werden." echo "cd $(pwd) || exit 1" > $qdir/$i.sh if [ "x$@" = "x-" ] ; then echo "Kommandos eintippen, Beenden mit Ctrl-D" cat >> $qdir/$i.sh else echo "$@" >> $qdir/$i.sh fi echo "Job $qdir/$i.sh:" cat $qdir/$i.sh fi