Backupscript nur per SSH

bulb82

New Member
Hallo,

ich habe mir ein Backupscript geschrieben, welches alle neuen Dateien auf einen FTP-Server kopiert. Wenn ich mein Script per SSH ausführe ist auch alles super.

Code:
sh /root/bin/backup_projektname

Trage ich nun das Script jedoch in die geplanten Aufgaben bei Plesk ein, so meldet er folgenden Fehler.

** Daten fuer Domain.de **
Anzahl der Dateien: 7
:::::::::::::: - Unknown error
/root/bin/temp/projektname Unknown error
:::::::::::::: - Unknown error
- Logfile vom FTP -
Cannot open local file /var/www/vhosts/domain.de/httpdocs/projektname/data/:::::::::::::: for reading: No such file or directory.
Cannot open local file /var/www/vhosts/domain.de/httpdocs/projektname/data//root/bin/temp/projektname_tmpftp for reading: No such file or directory.
Cannot open local file /var/www/vhosts/domain.de/httpdocs/projektname/data/:::::::::::::: for reading: No such file or directory.
- Logfile Ende -
**************************

20 10 * * * sh /root/bin/backup_vproject

Die Pfade stimmen... Ruft der cron das Script mit einem anderen user oder so ab?
 
Last edited by a moderator:
Eigentlich schon. Man wählt in Plesk ja den entsprechenden user aus, mit dem das geplante Script ausgeführt werden soll.
unter crontab selbst steht ja kein weiterer User drin. Das bedeutet doch, dass es Root sein muss.Oder?
 
Laut Log wurde das Script auch mit root aufgerufen.

Code:
Aug 11 10:20:01 s15440429 crond[31071]: (root) CMD (/usr/lib64/sa/sa1 1 1)
Aug 11 10:20:01 s15440429 crond[31072]: (root) CMD (sh /root/bin/backup_projektname )
 
Und was macht

Code:
/root/bin/[B]temp[/B]/projektname Unknown error

also der temp Ordner da?
 
Und was macht

Code:
/root/bin/[B]temp[/B]/projektname Unknown error

also der temp Ordner da?

Nach temp werden nur ein paar Dateien geschrieben, die dann per script wieder verwendet werden

Das Script ansich sucht nur aktuelle Datein und gleicht diese mit den alten Datein ab.

Code:
unset xraum
xraum=($( < /root/bin/vpraum.txt))
xraum_anz=${#xraum[@]}
xraum_anz=$xraum_anz-1
for ((i=0; i<=$xraum_anz; i++))
do
  echo "** Daten fuer ${xraum[i]} **" >> /root/bin/backup_message.mail
# Holen des Directory auf dem backupserver groeÃe und name der datei
  ncftpls -u xxx -p xx -l ftp://ftp/123/${xraum[i]} | tr -s " " | cut -d " " -f5,9 > /root/bin/backup_projektname/${xraum[i]}_tmpdir

# loeschen des stringes damit nur dei datei uebrig bleibt
  sed "s!${xraum[i]}/!!g" /root/bin/backup_projektname/${xraum[i]}_tmpdir > /root/bin/backup_projektname/${xraum[i]}_backdir

# holen des Directory auf dem rootserver groeÃe und name der dateien
  ls -l /var/www/vhosts/domain.de/httpdocs/${xraum[i]}/data > /root/bin/backup_projektname/${xraum[i]}_orgdir1

# beschneiden un formatieren der strings
  more /root/bin/backup_projektname/${xraum[i]}_orgdir1 | tr -s " " | cut -d " " -f5,9 > /root/bin/backup_projektname/${xraum[i]}_orgdir

# vergleich der beiden Verzeichnisse
  diff /root/bin/backup_projektname/${xraum[i]}_orgdir /root/bin/backup_projektname/${xraum[i]}_backdir | grep '<' > /root/bin/backup_projektname/${xraum[i]}_tmpftp
#  sed "s!< !!g" /root/bin/${xraum[i]}_tmpftp > /root/bin/${xraum[i]}_ftpfiles
  more /root/bin/backup_projektname/${xraum[i]}_tmpftp | cut -d " " -f3 > /root/bin/backup_projektname/${xraum[i]}_ftpfiles

# Packen der Logfiles f Mailertragung
  zip -D /root/bin/backup_projektname/back_${xraum[i]}.zip  /root/bin/backup_projektname/${xraum[i]}_tmpdir
  zip -D /root/bin/backup_projektname/back_${xraum[i]}.zip  /root/bin/backup_projektname/${xraum[i]}_orgdir
  zip -D /root/bin/backup_projektname/back_${xraum[i]}.zip  /root/bin/backup_projektname/${xraum[i]}_ftpfiles

  unset xfiles
  xfiles=($( < /root/bin/backup_projektname/${xraum[i]}_ftpfiles))
  xfiles_anz=${#xfiles[@]}
  xfiles_anz=$xfiles_anz-1
  echo "Anzahl der Dateien: $(cat /root/bin/backup_projektname/${xraum[i]}_ftpfiles | wc -l) " >> /root/bin/backup_message.mail
  for ((a=0; a<=$xfiles_anz; a++))
  do
    ncftpput -u xxx -p xxx -e /root/bin/backup_projektname/ftplog_${xraum[i]} -V ftp  /123/${xraum[i]}/ /var/www/vhosts/domain.de/httpdocs/${xraum[i]}/data/${xfiles[a]}
    if [ $? -ne 0 ] ; then
      case $? in
        1) echo "${xfiles[a]} - Could not connect to remote host." >> /root/bin/backup_message.mail;;
        2) echo "${xfiles[a]} - Could not connect to remote host - timed out." >> /root/bin/backup_message.mail;;
        3) echo "${xfiles[a]} - Transfer failed." >> /root/bin/backup_message.mail;;
        4) echo "${xfiles[a]} - Transfer failed - timed out." >> /root/bin/backup_message.mail;;
        5) echo "${xfiles[a]} - Directory change failed." >> /root/bin/backup_message.mail;;
        6) echo "${xfiles[a]} - Directory change failed - timed out." >> /root/bin/backup_message.mail;;
        7) echo "${xfiles[a]} - Malformed URL." >> /root/bin/backup_message.mail;;
        8) echo "${xfiles[a]} - Usage error." >> /root/bin/backup_message.mail;;
        9) echo "${xfiles[a]} - Error in login configuration file." >> /root/bin/backup_message.mail;;
        10) echo "${xfiles[a]} - Library initialization failed." >> /root/bin/backup_message.mail;;
        11) echo "${xfiles[a]} - Session initialization failed." >> /root/bin/backup_message.mail;;
        *) echo "${xfiles[a]} - Unknown error" >> /root/bin/backup_message.mail;;
      esac
    else
        echo "${xfiles[a]} - ok" >> /root/bin/backup_message.mail
    fi
  done
  # Logfile Ran wenn Fehler aufgetreten sind
  if [ -f /root/bin/backup_projektname/ftplog_${xraum[i]} ]
  then
    echo " - Logfile vom FTP -"  >> /root/bin/backup_message.mail
    tail /root/bin/backup_projektname/ftplog_${xraum[i]}  >> /root/bin/backup_message.mail
    echo " - Logfile Ende -"  >> /root/bin/backup_message.mail
  fi
 
Ich hab das Script mal grob überflogen. Du erstellst aus einer Datei ein Array von vpraum.txt (in dessen Inhalt hoffentlich keine Leerzeichen vorkommen) und arbeitest den Inhalt dann mit ncftpls ab (ausgabe der Dateiliste) und löst den Namen raus ..... viel code später.... sieht so aus, als ob du dir eine Rekursion mit der Tiefe 1 erstellt hast.

Zwischendurch speicherst du Logausgeben und wertest sogar Fehler aus. Für jemanden, der das Script nicht geschrieben hat, ist es nicht so einfach zu verstehen.

Lief das Script denn früher fehlerfrei (mit cron)?

Ich glaube neu scripten wäre effektiver. Aber bevor du alles hinschmeißt, setzt mal folgendes in den Kopf deines Scriptes ein:
Code:
#!/bin/sh
export LC_ALL=C
#code

Dann einmal ganz normal in der Shell ausführen und gucken ob Fehler auftreten und dann als Cronjob laufen lassen.

PS: Das ist der Mist beim Shell-Scripting. Wenn man einmal den Wolf drin hat, ist es meistens etwas ganz banales, was einem aber trotzdem viel Zeit kostet.
 
export LC_ALL=C

Habe ich eingfügt. Über SSH ausgeführt, erscheinen keine Fehlermeldungen.

Wenn ich das Ganze wiederrum über Cron ausführen lasse passiert folgendes.

Als Fehler wird nun
ncftpput /var/www/vhosts/domain.de/httpdocs/projekt_name/data/::::::::::::::: could not open file.
ausgegeben.

Dann bin ich mal auf die Idee gekommen mir ${xfiles[a]} ausgeben zu lassen.
hier gibt er in der Tat
::::::::::::::
aus. Wo kommen diese Doppelpunklte jedoch her?

Ich habe dann die temporären Files aufgehoben und verglichen. Dabei

orgdir1
total 33342700
-rw-r--r-- 1 root root 254316 Jan 1 2000 00081b817b16be01e8369e75a62259
-rwxr-xr-x 1 apache apache 6988740 Nov 23 2010 000e488bc1246abb58d81db9b42f65

orgdir
::::::::::::::
/root/bin/tmp/projekt_name_orgdir1
::::::::::::::
254316 00081b817b16be01e8369e75a62259
6988740 000e488bc1246abb58d81db9b42f65

Somit wird die Fehlermeldung in der Zeile ausgelöst.

more /root/bin/tmp/${xraum}_orgdir1 | tr -s " " | cut -d " " -f5,9 > /root/bin/tmp/${xraum}_orgdir


reagiert das more nun beim Aufruf über Cron anders? Dies ist doch eigentlich nur ein Filterwerkzeug. Bzw warum schreibt er den Pfad/Dateinamen in die Datei rein?
 
Das hat mich eh gewundert, wieso du more verwendest. Der Befehl cat wäre an dieser Stelle passender.
 
Back
Top