backup script geht nicht

pertze

DuBHeaD
hallöle,

ich wollt mir grad ein ganz simples backup script schreiben, aber da kommen mir unerklärliche fehler:

Code:
#!/bin/sh


SAVE="/etc /usr/local/etc /dat2/save /dat1/docs"
SAVEDATE=`date +%Y-%m-%d_%H:%M:%S`
SAVEDIR="/dat2/backup"


for i in $SAVE
do
        if [ -d $i ]
        then
                SAVELINE="$i $SAVELINE"
        else
                echo "$SAVEDATE $i does not exist and will be ignored." >> /var/log/backup.log
        fi
done

TITLE=${SAVEDIR}/${SAVEDATE}.tar

tar --create --preserve --absolute-paths --file $TITLE $SAVELINE
hier der fehler nach dem programmaufruf:
Code:
tar: Obsolete option name replaced by --absolute-names
rcmd: getaddrinfo: No address associated with hostname
tar: /dat2/backup/2003-09-09_18\:23\:38.tar: Cannot open: Input/output error
tar: Error is not recoverable: exiting now
ich dachte erst es liegt an der SAVELINE, drum habe ich die komplette for schleife auskommentiert, aber immer noch dieser fehler
man beachte die backslashs bei der uhrzeit ...

kann mir das einer erklären?

vinc
 
Soweit ich das sehe führt der Doppelpunkt im Namen des tar files dazu, dass er das file per rmt anlegen will. Das geht offensichtlich nicht (deshalb die rcmd Meldung). Lass den Doppelpunkt weg oder benutz die Option '--force-local'.
 
Original geschrieben von vincent v.
hallöle,

ich wollt mir grad ein ganz simples backup script schreiben, aber da kommen mir unerklärliche fehler:

Code:
#!/bin/sh


SAVE="/etc /usr/local/etc /dat2/save /dat1/docs"
SAVEDATE=`date +%Y-%m-%d_%H:%M:%S`
SAVEDIR="/dat2/backup"


for i in $SAVE
do
        if [ -d $i ]
        then
                SAVELINE="$i $SAVELINE"
        else
                echo "$SAVEDATE $i does not exist and will be ignored." >> /var/log/backup.log
        fi
done

TITLE=${SAVEDIR}/${SAVEDATE}.tar

tar --create --preserve --absolute-paths --file $TITLE $SAVELINE
hier der fehler nach dem programmaufruf:
Code:
tar: Obsolete option name replaced by --absolute-names
rcmd: getaddrinfo: No address associated with hostname
tar: /dat2/backup/2003-09-09_18\:23\:38.tar: Cannot open: Input/output error
tar: Error is not recoverable: exiting now
ich dachte erst es liegt an der SAVELINE, drum habe ich die komplette for schleife auskommentiert, aber immer noch dieser fehler
man beachte die backslashs bei der uhrzeit ...

kann mir das einer erklären?

vinc

Hi

Ich habe (unter OpenBSD) mit deinem Script etwas "herumgespielt" und dabei ist Folgendes rausgekommen:

#!/bin/sh

BACKUP=${BACKUP:=$HOME/backup} # --> ist von mir zu Testzwecken eingebaut worden.
SAVE=${SAVE:=/etc /usr/local/share} # --> die fehlenden Verzeichnisse musst du noch einbauen.
SAVEDATE=${SAVEDATE:=`date +%Y-%m-%d_%H:%M:%S`}
SAVEDIR=${SAVEDIR:=$BACKUP} #--> kann natürlich geändert werden


for i in $SAVE
do
if [ -d $i ]
then
SAVELINE="$i $SAVELINE"
else
echo "$SAVEDATE $i does not exist and will be ignored." >> /var/log/backup.log
fi
done

TITLE=$SAVEDIR/$SAVEDATE.tar.gz #--> Suffix geändert (wegen zip-Packen)

tar -pzcPf $TITLE $SAVELINE #--> ich habe die kurzen Switches benutzt. Unter FreeBSD muss es auch gehen.

# Der einzige Unterschied ist, dass die Archive gezippt werden (den Speicher sparen!)


#########################################

Bei mir hat es geklappt und muss eigentlich auch bei dir funzen.

Gruß

CW
 
Zuletzt bearbeitet:
omg ... hilfe ...
also erstmal danke für die schnelle antwort ihr beiden :>
aber ich hab grad fast nen herzkasper bekomm

also ich hab erstmal mit der option --force-local gemacht, damit ging es sogar, nur enthielt der dateiname nicht die zeit sondern komische sonderzeichen

dann hab ich cw's version getestet, da kam genau der gleiche fehler wie vorher - also musste es an den doppelpunkten liegen ...

soweit so gut ...

dann habe meine version genommen, nur statt der doppelpunke ein bindestrich wie beim datum ... aber auf einmal findet er die zu sichernden verzeichnisse nicht mehr ... lol?
/etc usw soll es angeblich nicht geben

dann seh ich plötzlich eine datei die "--force-local" heißt und die ich nicht löschen kann (als root)
desweiteren tauchen verschiedenste verzeichnisse unter /dat2 auf die es vorher nicht gab .... die aber mit der sicherung zu tun hatten (unter anderen was mit dem hostname usw.)

auf einaml guck ich in mein sicherungs verzeichnis und siehe da, auf einmal hat es geklappt obwohl bis dahin nur fehler kamen ... aber urplötzlich sehe ich die tar files mit datum_zeit als dateinamen

alles in allem is mir die sache zu heikel und anscheinend sollte die option --force-local mit vorsicht genossen werden ...

auf jeden fall werde ich jetzt einfach das backup script von grunix nehmen in howtos ...

so denn, vinc
 
Original geschrieben von vincent v.
omg ... hilfe ...
also erstmal danke für die schnelle antwort ihr beiden :>
aber ich hab grad fast nen herzkasper bekomm

also ich hab erstmal mit der option --force-local gemacht, damit ging es sogar, nur enthielt der dateiname nicht die zeit sondern komische sonderzeichen

dann hab ich cw's version getestet, da kam genau der gleiche fehler wie vorher - also musste es an den doppelpunkten liegen ...

soweit so gut ...

dann habe meine version genommen, nur statt der doppelpunke ein bindestrich wie beim datum ... aber auf einmal findet er die zu sichernden verzeichnisse nicht mehr ... lol?
/etc usw soll es angeblich nicht geben

dann seh ich plötzlich eine datei die "--force-local" heißt und die ich nicht löschen kann (als root)
desweiteren tauchen verschiedenste verzeichnisse unter /dat2 auf die es vorher nicht gab .... die aber mit der sicherung zu tun hatten (unter anderen was mit dem hostname usw.)

auf einaml guck ich in mein sicherungs verzeichnis und siehe da, auf einmal hat es geklappt obwohl bis dahin nur fehler kamen ... aber urplötzlich sehe ich die tar files mit datum_zeit als dateinamen

alles in allem is mir die sache zu heikel und anscheinend sollte die option --force-local mit vorsicht genossen werden ...

auf jeden fall werde ich jetzt einfach das backup script von grunix nehmen in howtos ...

so denn, vinc

Seltsam ... ich habe gerade einige Backups gemacht :)

Aber egal ... :)

Gruß

CW
 
dass er die zu sichernden veruzeichnisse nicht findet war ein schreibfehler von mir .. das geht jetzt
und statt der zeit nehme ich jetzt nur das datum im dateiname, damit funktioniert es auch einwandfrei
 
Habe grade entdeckt, dass er wohl bei zu langen Dateinamen Probleme hat.

tar: File name too long for ustar

CW
 
Da ich mit dem obengenannten Script ein bisschen "zu lange" herumgespielt habe, ist daraus ein kleines Monster geworden und wartet darauf, auf eure DATEN losgelassen zu werden ;)

Scherz, ... es ist nichts besonderes daran ... ein paar Optionen hier, einige Befehle dort und fertig ist die Sache.

Jetzt kann man mit dem Script sowohl packen als auch entpacken.

Dazu noch hat man die Möglichkeit, mehrere tarballs gleichzeitig zu entpacken (was bei tar standardmäßig nicht geht).

Und wenn man den Script "ohne alles" startet, dann sichert es folgende Verzeichnisse: /etc /home /var/www und legt diese unter dem Homeverzeichnis/backup an. Sollte backup nicht existent sein, wird es angelegt.

Ich habe es nur unter OpenBSD testen können und eigentlich sollte "das Ding" auch unter den anderen BSDs ohne Probleme laufen.

Solltet ihr irgendwelche Fehler feststellen oder einfach mal etwas kritisieren wollen, so schreibt es hier rein, dann verschlimmbessere ich den Shell-Code. ;)

Probiert es mal aus und riskiert ein paar wichtige Dateien ;)

Gruß

CW

Code:
#!/bin/sh
#
# BACKUP.SH v 0.1
#
# Datum: 10.09.2003
# Zeit : 00:55:52
# Autor: CW
#
# Nach einer Grundidee von: vincent v.
#
##################################################
##############################
#
# Copyright (C) 2003 CW
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without modification, are permitted
# provided that the following conditions are met:
#
# 1. Redistributions of source code must retain the above copyright notice, this list of conditions
# and the following disclaimer.
#
# 2. Redistributions in binary form must reproduce the above copyright notice, this list of
# conditions and the following disclaimer in the documentation and/or other materials provided
# with the distribution.
#
# 3. The name of the author may not be used to endorse or promote products derived from this
# software without specific prior written permission.
#
# 4. All advertising materials mentioning features or use of this software must display the
# following acknowledgement:
#
# This product includes software developed by CW
#
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
# BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
# EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
##################################################
##################################################
#
#
# Dieser Script basiert auf dem Original-Script von vincent v.
#
# Zu finden unter: [url]http://www.bsdforen.de/forums/showthread.php?s=08aeb976e0af42d48e47e1ec5b97b6b9&postid=8519#post8519[/url]
#
# [url]http://www.bsdforen.de[/url]
#
#
##################################################################################################
#
# Dieser Script kann zum Sicherung/Entpacken von Verzeichnissen oder einzelnen Dateien herangezogen werden.
#
# Vor der Benutzung bitte unbedingt die Hilfe-Infos mit dem Schalter [b]-hilfe[/b] aufrufen!
#
##################################################################################################

BACKUP=${BACKUP:=$HOME/backup}
SAVE=${SAVE:=/etc /home /var/www}
SAVEDATE=${SAVEDATE:=`date +%H:%M:%S_%Y`}
SAVEDIR=${SAVEDIR:=$BACKUP}
SAVENAME=${SAVENAME:=Archive}
RESTOREDIR=${RESTOREDIR:=$PWD}

case $1 in

	-help) echo -n "\n\n                                    BACKUP.SH v 0.1\n\n"
	       
	       echo -n "\nSYNTAX: sh backup.sh { [-help] } { [-restore] | [-restore-all] } { [Dateiname] } { [Archiv-Pfad] | [RESTORE-Verz.]\n"
	       echo -n "---------------------------------------------------------------------------------------------------------------------\n\n\n"
	       echo -n "Wenn keine Verzechnisse angegeben worden sind, werden ${SAVE} archiviert.\n\n"
	       echo -n "Wenn kein Archiv-Verzeichniss angegeben wurde, wird $HOME/backup die jeweilige Archiv-Datei darunter angelegt.\n\n"
	       echo -n "\n---------------------------------------------------------------------------------------------------------------------\n"
	       echo -n "\n\n\nFolgende Optionen können angewandt werden:\n\n"
	       echo -n "-help                                   --> diese Info anzeigen\n\n"
	       echo -n "-restore [ARCHIV] [RESTORE-ORDNER]      --> ARCHIV in den RESTORE-ORDNER entpacken\n\n"
	       echo -n "-restore-all [ORDNER] [RESTORE-ORDNER]  --> alle im ORDNER vorhanden tar.gz-Archive in den RESTORE-ORDNER entpacken\n\n\n"
	       echo -n "\n---------------------------------------------------------------------------------------------------------------------\n\n"
	       echo -n "backup.sh [Datei-/Verzeichnisname] [ARCHIV-NAME] --> Packt die angegebenen Dateien unter ARCHIV-NAME\n\n"
	       echo -n "Wenn \"backup.sh -restore\" ohne Verzeichnisangaben gestartet wurde, wird das Programm abgebrochen.\nDa ein BACKUP-Verzeichnis auch mehrere Archive beinhalten kann, wird erst gar nicht versucht,\ndiese zu entpacken.\n\n"
	       	       echo -n "Wenn \"backup.sh -restore-all\" ohne Angaben gestartet wurde, such es automatisch"
	       echo -n "nach $HOME/backup\nund entpackt alle vorgefundenen tar.gz-Archive in den RESTORE-ORDNER.\n\nDiese Option sollte nur dann ausgeführt werden, wenn verschiedene Archiv-Dateien entpackt werden sollen.\n\n"
	       echo -n "\nWenn kein RESTORE-ORDNER bei -restore angegeben wird, wird versucht unter $HOME/backup die Archive\nzu entpacken. Wenn $HOME/backup nicht existiert, wird es angelegt.\n\n"
	       exit 0 ;;


	-restore-all) if ! [ -z $2 ]; then
	 
			BACKUP=$2

	        	fi
		
	                if ! [ -z $3 ]; then
		
			RESTOREDIR=$3

		        else RESTOREDIR=$2

                        fi

	       	        for ARCHIVE in `ls -1 $BACKUP/*.tar.gz`; 
			
			do tar xzvf $ARCHIVE -C $RESTOREDIR; 
				
			done

		        exit 0;;

        -restore) 
                         if [ -z $2 ]; then
	 
			 echo -n "\n\nFEHLER: Archiv-Name MUSS angegeben werden!\n\n" && exit 0

		         else BACKUP=$2

		         fi

		         if ! [ -f $BACKUP ]; then
				 
		         echo -n "\n\nFEHLER: Datei nicht vorhanden oder nicht lesbar!\n\n" && exit 0

		         fi
		
	                 if ! [ -z $3 ]; then
		
		   	 RESTOREDIR=$3

                         fi		
			 
		         tar xzvf $BACKUP -C $RESTOREDIR

		         exit 0;;

	       *)        if ! [ -z $1 ];then
			 
	                 SAVE=$1
		    
		         fi;;
	 
esac


if ! [ -z $2 ]; then
	
	   SAVEDIR=$2

   fi


for i in $SAVE

do
        if [ -d $i ]
        
	then
        
		SAVENAME="$1 $i"
        else
		
                echo "$SAVENAME $i existiert nicht und wird ignoriert." >> /var/log/backup.log
        
	fi

done

if ! [ -d $SAVEDIR ]; then

mkdir $SAVEDIR

fi

TITLE=$SAVEDIR/$1_$SAVEDATE.tar.gz

tar -vpzcPf $TITLE $SAVENAME

echo -n "\n\n$SAVE wurde unter $SAVEDIR$1_$SAVEDATE erfolgreich archiviert!\n\n"
 
Zuletzt bearbeitet:
sieht gut aus, habs aber noch nicht ausprobiert.
Zwei sachen:
1. kannst du 'code' tags um das script machen, ich glaub dann bricht der nicht einfach um.
2. ich habs noch nicht benutzt, weil ich zum Beispiel ein Verzeichnis /home/user/video habe, welches ich nicht mitsichern kann/will, kann man das irgendwie noch einbauen, dass man so ein Verzeichniss rausnehmen kann?
ich dachte da an sowas wie:
# touch /home/user/video/.nobackup
und wenn die Datei existiert wird das Verzeichnis sammt aller Unterverzeichnisse nicht gesichert...

gruss
Male
 
Original geschrieben von Maledictus
sieht gut aus, habs aber noch nicht ausprobiert.
Zwei sachen:
1. kannst du 'code' tags um das script machen, ich glaub dann bricht der nicht einfach um.


Sorry deswegen ... habe nicht daran gedacht.

Ich werde es nachträglich verbessern.

2. ich habs noch nicht benutzt, weil ich zum Beispiel ein Verzeichnis /home/user/video habe, welches ich nicht mitsichern kann/will, kann man das irgendwie noch einbauen, dass man so ein Verzeichniss rausnehmen kann?

ich dachte da an sowas wie:
# touch /home/user/video/.nobackup
und wenn die Datei existiert wird das Verzeichnis sammt aller Unterverzeichnisse nicht gesichert...

Da könnte man eine Variable in den Code setzen, die den Default-Namen hat (z.B. nobackup) und danach mit

Code:
if [ -f $VARIABLE ]; then
echo -n "\n\nSoll nicht gesichert werden!" && exit 0
fi

abbricht.

Es wäre auch möglich, den jeweligen Ordner aufzulisten (mit einer for-Schleife) und nach der .nobackup-Datei zu suchen.

Ich werde es mal testen ....

und es danach in den Code einbauen.

Gruß

CW
 
Zuletzt bearbeitet:
man kann doch einfach eine EXCLUDE variable setzen, in die alle verzeichnisse kommen die nicht gesichert werden sollen.

Code:
EXCLUDE"/home/vinc/mp3 /home/mrx/video"

und dann kann man dem tar befehl --exclude anhängen
Code:
for i in $EXCLUDE
do
        if [ -d $i ]
        then
                EXCLUDELINE="--exclude=$i/* $EXCLUDELINE"

        else
                echo "$SAVEDATE $i does not exist and will be ignored." >> /var/log/backup.log
        fi
done

[...]

tar --create --preserve --absolute-names $EXCLUDELINE --file $TITLE $SAVELINE
 
Original geschrieben von vincent v.
man kann doch einfach eine EXCLUDE variable setzen, in die alle verzeichnisse kommen die nicht gesichert werden sollen.

Code:
EXCLUDE"/home/vinc/mp3 /home/mrx/video"

und dann kann man dem tar befehl --exclude anhängen
Code:
for i in $EXCLUDE
do
        if [ -d $i ]
        then
                EXCLUDELINE="--exclude=$i/* $EXCLUDELINE"

        else
                echo "$SAVEDATE $i does not exist and will be ignored." >> /var/log/backup.log
        fi
done

[...]

tar --create --preserve --absolute-names $EXCLUDELINE --file $TITLE $SAVELINE

Geht auch so. Jedoch muss man immer die Variable $EXCLUDE up-to-date halten.

Das sollte bei Heim-PCs aber keine so große Sache sein.

Nur bei großen Systemen kann es etwas haariger werden ;)

Gruß

CW
 
Zurück
Oben