Langlaufende Shell-Skripte updaten

14/11/2007 - 12:58 von Bernhard Wallner | Report spam
Hall NG,

ich habe ein Skript, das jeden Tag startet (cronjob) und etwa 23 Stunden
braucht. D.h. ich habe immer nur eine kurze Zeitspanne das Skript zu
ersetzen. (Das Ersetzen laufender Skripten führt manchmal zum Absturz.)

Jetzt habe ich mir folgende Lösung ausgedacht:
Beim Start des Skripts wird eine Kopie im tmp-Bereich erstellt und diese
im Hintergrund gestartet. Etwa so:

autoclone () {
CLONE=yes
MYSELF=$0
ORIGPATH=`dirname $0`

if [ $ORIGPATH = "." ]
then
ORIGPATH=`pwd`
fi

while [ "$1" ]
do
case $1 in
*) ARGS="$ARGS $1";;
esac
shift
done

if [ "$CLONE" = "yes" ]
then
TMP=/tmp/.clone
[ ! -d $TMP ] && mkdir $TMP
CLONEPROG=$TMP/`basename $0`
rm -f $CLONEPROG

cp $MYSELF $CLONEPROG
[ $? -ne 0 ] && echo "no clone copy" >&2 && exit 1
eval $CLONEPROG $ARGS --orgPath ${ORIGPATH} --noautoclone &
exit 0
fi
echo "ARGS=$ARGS"
}


autoclone $*
echo "clone prog:$0"
echo "clopn prog:$#"
echo "clone prog:$*"
sleep 10
echo "Ende: `date`"
exit 0

Frage: Wie kann ich $# und $* modifizieren, dass nur die Ausgangswerte
vorhanden sind?
Für andere Lösungen des Problems bin ich natürlich auch dankbar.

Gruß,

Bernhard

Bernhard Wallner
Munich
Germany
 

Lesen sie die antworten

#1 Hauke Laging
14/11/2007 - 13:31 | Warnen spam
Bernhard Wallner schrieb am Mittwoch 14 November 2007 12:58:

ich habe ein Skript, das jeden Tag startet (cronjob) und etwa 23
Stunden braucht. D.h. ich habe immer nur eine kurze Zeitspanne das
Skript zu ersetzen. (Das Ersetzen laufender Skripten führt manchmal
zum Absturz.)

Jetzt habe ich mir folgende Lösung ausgedacht:



Darf ich mal eine Alternative vorschlagen, ohne mich lange mit dem
Rest des Postings zu befassen...

mkdir /targetdir
cp -p mein_script /target_dir/mein_script.1
cd /targetdir
ln -s mein_script.1 mein_script
./mein_script

Update:
set -e
cd /targetdir
aktuelles_ziel=$(readlink mein_script)
if [ mein_script.1 = "$aktuelles_ziel" ]
then
new=mein_script.2
old=mein_script.1
elif [ mein_script.2 = "$aktuelles_ziel" ]
new=mein_script.1
old=mein_script.2
else
echo "Hier laeuft was verkehrt; Abbruch"
exit 1
fi
cp -p /sourcedir/mein_script ./"$new"
ls -sf "$new" mein_script
rm "$old"


Das rm dient nur der Optik. Es sollte unproblematisch sein, weil die
Shell (nach dem Öffnen) auf den Inode zugreift und nicht auf den
Dateinamen.

So in der Art mache ich das auf meinen Rechnern. Das ist Teil der
Updateroutine, die die Standardscripte auf allen Rechnern lokal
ersetzt. Allerdings habe ich da zwei Verzeichnisse, zwischen denen
der Symlink umschaltet.


CU

Hauke
http://www.hauke-laging.de/ideen/
http://www.hauke-laging.de/software/
http://zeitstempel-signatur.hauke-laging.de/
Wie können 59.054.087 Leute nur so dumm sein?

Ähnliche fragen