Problem back-Up Skript

Hallo!

Habe ein kleines Back-Up Skript geschrieben das sich jedoch merkwürdig verhält. Bzw. das Merkwürdige ist, dass es unter OpenSuse schon einmal funktioniert hat und jetzt Fehler bei der Ausführung gemeldet werden.

System ist OpenSuse 11.2 im VMware-Player, als Server wird das xampp-Sammelsorium eingesetzt.

Wer kann mir helfen? Im Folgenden noch das Skript und die Fehler.

Skript:

#benötigte Variablen
export tmp
export lokal_file
export remote_file
export archive_file
export comp
export pathFtp

# Datum setzen
set `date`

# Backup-Verzeichnis auf dem FTP-Server
pathFtp=backup

# Datei komprimieren
lokal_file=$HOME/dump.sql
tar -zcvf $HOME/dump.tgz $lokal_file #temporärer Speicherot für Archiv-Datei
comp="*\.tgz"
#bzip2 -kf $lokal_file # Auskommentieren wenn bzip2-Komprimierung genutzt werden soll
#comp="*\.bz2"         # Auskommentieren wenn bzip2-Komprimierung genutzt werden soll

# Diese Datei:
archive_file=$HOME/dump.tgz
#archive_file=$HOME/dump.sql.bz2   # Auskommentieren wenn bzip2-Komprimierung genutzt werden soll
# ... wird hochgeladen nach:
tmp=/$pathFtp/dump_                #dump_ ist das Präfix für den Dateinamen der Archivdatei
remote_file="$tmp$6.$3.$2tgz"
#remote_file="$tmp$6.$3.$2sql.bz2" # Auskommentieren wenn bzip2-Komprimierung genutzt werden soll

# Daten auf ftp-Server übertragen
ftp localhost <<EOFTP
bin
put $archive_file $remote_file
quit
EOFTP
# Archiv-Datei löschen
rm $archive_file
# SQL-Datei löschen
#rm $lokal_file

# Dateien auf dem Server ermitteln
var=$(ftp localhost <<EOFTP
bin
cd $pathFtp
nlist
quit
EOFTP
)
set -- $var

# Datum der Dateien auf dem Server ermitteln
var2=$(( #echo "user nobody lampp" 
echo "cd $pathFtp"
for FILE in $* 
 do
  # in $var stehen auch Meldungen vom FTP-Server drinnen 
  # -> prüfen ob es sich bei aktuellem Argument wirklich um eine Datei handelt
  # Ausgabe von grep "wegwerfen"
   if echo $FILE | grep -E $comp > /dev/null 
      then 
        echo "modtime $FILE" 
   fi
 done 
echo "bye" 
) | ftp localhost)

set -- $var2

export j
export k
export day
export month
export year
export datei
export dateien
export timespan 
j=1
k=1
#Zeitspanne (z.B. 12 Monate) nach der Daten gelöscht werden sollen
# Befehl liefert vergangene Sekunden vom 1.1.1970 bis heute vor 12 Monaten
timespan=`date -d "12 month ago" +%s`
# Sekunden der Zeitspanne (z.B. 12 Monate) berechnen
let timespan=`date +%s`-timespan 

# Alle Dateien heraussuchen die älter als timespan sind
for i in $*
  do 
     case $k in
       # Dateiname (oder Schrott ...)
       1 )  if echo $i | grep -E $comp > /dev/null
		then
		   datei=$i
		else
		   k=0
	    fi;;
       # Tagname (Tue / Wed / ...)
     # 2 ) 
       # Monat (Jan/Feb/... - verbale Ausgabe muss zur Weiterverarbeitung in Zahl gewandelt werden
       3 )  case $i in
		Jan ) month=01;;
		Feb ) month=02;;
		Mar ) month=03;;
		Apr ) month=04;;
		May ) month=05;;
	   June ) month=06;;
	   July ) month=07;;
		Aug ) month=08;;
		Sep ) month=09;;
		Oct ) month=10;;
		Nov ) month=11;;
		  * ) month=12;;
	    esac;;
       # Tag
       4 )  day=$i;;
       # Uhrzeit
     # 5 )
       # Jahr (2010/2011/...)
       6 ) 	
	   k=0; 
           year=$i
           echo "Datei:" $datei "-- Aenderungsdatum: " $year/$month/$day " -- in Sekunden: " `date -d "$year/$month/$day" +%s`
           let tmp=`date +%s`-`date -d "$year/$month/$day" +%s`
           if  $tmp -gt $timespan ]
	     then echo "Datei > 3 Tage (tmp: " $tmp " / timespan: " $timespan ")"
	          dateien=`echo $dateien " " $datei` # entsprechende Datei zur Löschliste hinzufügen
           else
	     echo "Datei <= 3 Tage alt (tmp: " $tmp " / timespan: " $timespan ")"
           fi;;
       * ) ;;
     esac
     let j++
     let k++
done

# Dateien löschen
echo "Folgende Dateien werden geloescht: "
if echo $dateien | grep -E $comp > /dev/null
  then
   set -- $dateien

   for i in $*
    do
     echo $i
   done

   #Dateien löschen
  ( echo "cd $pathFtp"
    for i in $*
      do
        echo "delete $i"
      done
    echo "bye" 
   ) | ftp localhost
 fi           else
	     echo "Datei <= 3 Tage alt (tmp: " $tmp " / timespan: " $timespan ")"
           fi;;
       * ) ;;
     esac
     let j++
     let k++
done

# Dateien löschen
echo "Folgende Dateien werden geloescht: "
if echo $dateien | grep -E $comp > /dev/null
  then
   set -- $dateien

  ( echo "cd $pathFtp"
    for i in $*
      do
        echo "delete $i"
      done
    echo "bye" 
   ) | ftp localhost

 fi 

Fehler:

me@linux-5vyh:~> ./backup.sh
': Ist kein gültiger Bezeichner.mp
': Ist kein gültiger Bezeichner.okal_file
': Ist kein gültiger Bezeichner.emote_file
': Ist kein gültiger Bezeichner.rchive_file
': Ist kein gültiger Bezeichner.omp
': Ist kein gültiger Bezeichner.athFtp
: Kommando nicht gefunden.
: Kommando nicht gefunden.
: Kommando nicht gefunden.
tar: Entferne führende „/“ von Elementnamen
tar: /home/me/dump.sql\r: Kann stat nicht ausführen: Datei oder Verzeichnis nicht gefunden
tar: Exiting with failure status due to previous errors
: Kommando nicht gefunden.
: Kommando nicht gefunden.
Trying ::1...
Connected to localhost.
220 ProFTPD 1.3.2c Server (ProFTPD) ::1]
331 Password required for nobody
230 User nobody logged in
Remote system type is UNIX.
Using binary mode to transfer files.
?Invalid command.
.Jan.20.tgzackupdump.tgz
: No such file or directorygz
?Invalid command.
221 Goodbye.
rm: Entfernen von „/home/me/dump.tgz\r\r“ nicht möglich: Datei oder Verzeichnis nicht gefunden
: Kommando nicht gefunden.
: Kommando nicht gefunden.
./backup.sh: command substitution: Zeile 68: Syntaxfehler beim unerwarteten Wort'`do
'/backup.sh: command substitution: Zeile 68: ` do
: Kommando nicht gefunden.
: Kommando nicht gefunden.
': Ist kein gültiger Bezeichner.j
': Ist kein gültiger Bezeichner.k
': Ist kein gültiger Bezeichner.day
': Ist kein gültiger Bezeichner.month
': Ist kein gültiger Bezeichner.year
': Ist kein gültiger Bezeichner.datei
': Ist kein gültiger Bezeichner.dateien
': Ist kein gültiger Bezeichner.
")Syntaxfehler: Ungültiger arithmetischer Operator. (error token is "
: Kommando nicht gefunden.
'/backup.sh: Zeile 88: Syntaxfehler beim unerwarteten Wort `in
'/backup.sh: Zeile 88: `     case $k in


Hallo cb_68,
hast Du das Script von einem anderen Rechner auf das neue System kopiert und wenn ja …wie?
Zum debuggen solltest Du einfach mal das Script wie folgt starten:
bash -x ./<scriptname> >log 2>errlog
Scriptname ersetzt Du mit dem Namen von Deinem Script. Die “normale” Ausgabe kannst Du in der Datei log und die Fehlermeldungen in der Datei errlog nachlesen.
Zudem wäre es interessant was file <scriptname> sagt.
Kannst Dich ja noch mal melden, wenn Du nähere Informationen hast.
cu
sklemz

Danke für die Rückmeldung :slight_smile:
Mittlerweile ist das Problem mehr oder weniger gelöst. Habe Suse - diesmal in der aktuellen Version 11.3 - nochmal in einer andern VM installiert und da lief das Skript auf Anhieb.

Muss man den was besonderes beachten, wenn man Linux in einer VM installiert? Für Ubuntu z.B. wurde die Installation zusätzlicher Pakete empfohlen (build-essential, linux-header(s)).

…das kommt auf die VM Lösung an. Bei ESX(i) Servern solltest Du auf jeden Fall die VMware Tools/Treiber installieren.
Bei der Player, Workstation oder Fusion Version bin ich mir nicht sicher, hab’ ich jedenfalls noch nicht gemacht bzw. machen müssen. Die Empfehlung kann aber darin begründet sein, dass die Pakete zum kompilieren benötigt werden.

Ich denke mal, dass Dein Problem mit dem Script aus einer anderen Ecke kommt. Das mit dem Debuggen solltest Du Dir auf jeden Fall mal anschauen.