• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

Backupscript Probleme

rethus

Advanced Hacker
Hallo Leute, ich habe folgendes Backupscript:
Code:
#!/bin/bash

# the name of this stuff
PROGNAME=`basename $0`
# directory to save backupfile
DAR_VERZ="/home/samuel"

function error_exit
{
        echo "$1" 1>&2
        exit 1
}

###############################################################################
# Do a full Backup
###############################################################################
function doFullBackup
{

# Volles Backup
dar -v -c "$DAR_VERZ/BACKUP/home_$(date +%y%m%d_%H%M)" \
-R "$DAR_VERZ/" \
-s 4613734400 -p -D -y -m 256 \
-Z "*.avi" -Z "*.bz2" -Z "*.gif" -Z "*.gz" -Z "*.jpg" \
-Z "*.mov" -Z "*.mpg" -Z "*.pbm" -Z "*.pdf" -Z "*.png" \
-Z "*.pnm" -Z "*.Z" -Z "*.zip" \
-P "BACKUP" \
-P "downloads" \
-P ".kde/cache-desktop" \
-P ".kde/cache-linux" \
-P "MedienDatenbank" \
-P ".wine/" \
-P ".thumbnails/" \
-P ".googleearth/" \
-P "google-earth/" \
-P "+++tmp+++/" \
-P "wink/" \
-P "winetools/" \
-P "eclipseWorkspace/" \
-P ".ies4linux/" \
-P ".macromedia" \
-P ".netbeans" \
-P ".local/share/Trash"
}
###############################################################################
# Do an inkremental Backup
###############################################################################
function doInkBackup
{
# Inkrementelles Backup
dar -v -c "$DAR_VERZ/BACKUP/home_$(date +%y%m%d_%H%M)" \
-R "$DAR_VERZ/" \
-A "$DAR_VERZ/BACKUP/home_$LASTBACKUP" \
-s 734003200 -p -D -y -m 256 \
-Z "*.avi" -Z "*.bz2" -Z "*.gif" -Z "*.gz" -Z "*.jpg" \
-Z "*.mov" -Z "*.mpg" -Z "*.pbm" -Z "*.pdf" -Z "*.png" \
-Z "*.pnm" -Z "*.Z" -Z "*.zip" \
-P "BACKUP" \
-P "downloads" \
-P ".kde/cache-desktop" \
-P ".kde/cache-linux" \
-P "MedienDatenbank" \
-P ".wine/" \
-P ".thumbnails/" \
-P ".googleearth/" \
-P "google-earth/" \
-P "+++tmp+++/" \
-P "wink/" \
-P "winetools/" \
-P "eclipseWorkspace/" \
-P ".ies4linux/" \
-P ".macromedia" \
-P ".netbeans" \
-P ".local/share/Trash"
}

###############################################################################
# get Timestamp of the last Backup, and use it for new Filename
###############################################################################
function lastBackup
{	
	# Auslesen der letzten Zeile (lastBackup.inf), wenn incremental Backup ausgeführt werden soll.
	if [ -s "./lastBackup.inf" ]
	then
		LASTBACKUP=`tail -1 ./lastBackup.inf`
	fi
	# Den aktuellen Zeitpunkt festhalten, um incremental-Backups erzeugen zu können
	NEWBACKUP=$(date +%y%m%d_%H%M)
	echo $NEWBACKUP >> ./lastBackup.inf
}
if [ "$1" == "-i" ] 
	then TYP="Inkrementelles "
	else TYP="Full "
	fi

###############################################################################
# create list of actual installed packages
###############################################################################
function createRPMList ()
{
   	echo "Erstelle Liste der installierten RPMs"
	RPM=$DAR_VERZ/RPMListe_$(date +%y%m%d)
	/bin/rpm -qa | /usr/bin/sort >> $RPM
}

###############################################################################
# Main-Section of the Programm
###############################################################################
kdialog --yesno "$TYP Backup von '/home/samuel/' jetzt ausführen?"

createRPMList

if [ $? = 1 ]
then error_exit "Das Programm wurde beendet."
else 
	# Wenn -i gesetzt ist, mach das Backup inkrementell, sonst full-Backup
	if [ "$1" == "-i" ] 
	then
		lastBackup;
		if [ $LASTBACKUP ]
		then
			doInkBackup
			kdialog --yesno "Inkrementelles Backup wurde fertiggestellt. Bitte lege eine CD in den Brenner um das Backup home_$NEWBACKUP zu sichern.\nMöchten Sie das Brennprogramm jetzt starten?"
			# Öffne auf Wunsch direkt das Brennprogramm und füge die aktuelle Datei der CD hinzu
			if [ $? = 0 ]; then
				`/opt/kde3/bin/k3b --nosplash --datacd /home/samuel/BACKUP/home_$NEWBACKUP.1.dar /home/samuel/BACKUP/lastBackup.inf $RPM`
			fi
			
		else
			kdialog --error "Keine Vollsicherung in lastBackup.inf verzeichnet, daher kein inkrementelles Backup möglich!"
			error_exit
		fi
	else
		doFullBackup
		kdialog --yesno "Full Backup wurde fertiggestellt. Bitte lege eine DVD in den Brenner um das Backup home_$NEWBACKUP zu sichern.\nMöchten Sie das Brennprogramm jetzt starten?"
			# Öffne auf Wunsch direkt das Brennprogramm und füge die aktuelle Datei der CD hinzu
			if [ $? = 0 ]; then
				`/opt/kde3/bin/k3b --nosplash --datadvd /home/samuel/BACKUP/home_$NEWBACKUP.1.dar /home/samuel/BACKUP/lastBackup.inf $RPM /home/samuel/BACKUP/home.sh`
			fi
	fi
	
fi

exit 0

Dieses Scripf funktioniert als root in der Konsole ausgeführt wunderbar. Lasse ich es aber via Cron laufen, erhalte ich folgende Systemmail:
/home/samuel/BACKUP/home.sh: line 119: kdialog: command not found
Erstelle Liste der installierten RPMs
error: rpmdbNextIterator: skipping h#    3597 Header SHA1 digest: BAD Expected(36cf4e0706e620d0d0d1b5b79d978e6706168aeb) != (e9027be0aea512b0d899b91f7bd0a3030283356d)
No terminal found for user interaction. All questions will be assumed a negative answer (less destructive choice), which most of the time will abort the program.
Aborting program. User refused to continue while asking: /home/samuel/BACKUP/home_080519_1100.1.dar is required for further operation, please provide the file.
/home/samuel/BACKUP/home.sh: line 133: kdialog: command not found

Kann mir jemand einen Tipp geben, wie ich das hingebogen bekomme?

Warum kann ich das Script richtig ausführen, wenn ich es als root auf der Konsole starte, aber nicht per cron (welcher ja auch eigentlich unter dem User root läuft?
 

Wusel1007

Member
Damit kdialog funktioniert solltest Du es mit dem kompletten Pfad aufrufen. Anscheinend ist die Pfad Variable beim Aufruf via CRON leer und er findet daher das Programm einfach nicht.
 
konnte man dar die Ein- und Ausschlüsse nicht per Datei übergeben? Erscheint mir vor allem bei Änderungen sicherer, wenns nur einmal editiert werden muß.

Zum Problem bzw. zur Lösung: Full Ack
 
OP
R

rethus

Advanced Hacker
Hat keiner n Tipp zum Problem?
Das Script "schöner" machen kann man immer noch, wichtig ist mir, das es per Cron-Auruf funktioniert.

PS: Wie kann ich zwischendurch den Cron händisch starten? (Nur damit ich auch einen realen Cronaufruf simulieren kann)
 
OP
R

rethus

Advanced Hacker
Hat nur bedingt was gebracht, weil nun die Meldung
kdialog: cannot connect to X server
erscheint.

Nun habe ich mal versucht, --display :0 einzugeben.
Mal sehen, was der nächste Cronjob so ausspuckt.
 
A

Anonymous

Gast
1. cron in Verbindung mit interaktiven Programmen zu verwenden ist schonmal ein falscher Denkansatz. Cron ist konzipiert automatisch zu arbeiten und nicht mit irgend jemanden interaktiv. Wohin soll denn cron auch eine Eingabeaufforderung schicken und die Eingaben woher beziehen, wenn er gar nicht weiß ob da jetzt überhaupt einer sitzt oder nicht, und wenn da einer sitzt, welche Geräte dieser zur Ein und Ausgabe gerade benutzt und ob er auch die Rechte dazu hätte mit eben diesen Geräten auch zu kommunizieren.
Deshalb auch solche Fehlermeldung wie "No terminal found for user interaction. All questions will be assumed a negative answer (less destructive choice)......"

2. cron in Verbindung mit der Programmen der X-Oberfläche zu bringen ist ebenfalls ein falscher Denkansatz. Erstens weiß cron nicht ob gerade ein zwei drei oder gar kein X-Server läuft, noch wer davor sitzt und ob dieser überhaupt die Rechte für die Benutzung des XServers für den Cronprozess freigegeben hat. X-Server für Eingabe schon gar nicht und Ausgabe auf einem X-Server währe zwar theoretisch möglich aber nicht im Sinne des Erfinders. Cron arbeitet am liebsten mit Logdateien und dem Mülleimer aus Ausgabekanäle zusammen, alle anderen Ausgaben möchte er dir gerne per Mail zukommen lassen.

3. cronjobs laufen ohne eine Initialisierung der Shell, das bedeutet all die schönen Variablen die du tag-täglich unbewußt in der Konsole verwendest, wie zB PATH kennt der cronjob erst einmal nicht, da die Initialisierung für eine Loginshell und der Export der Variablen wie sie bei jeder Anmeldung eines Users am System erfolgt, überhaupt nicht stattgefunden hat. Du müsstest also innerhalb eines Scriptes oder innerhalb des Cron oder beim Programmaufruf selbst alle Variablen die du bewußt oder unbewußt benutzt, mit Werten belegen und gegebenenfalls auch noch exportieren. Dadurch musst du zB die meisten Programme mit vollem Path angeben, damit sie funktionieren, weil eben die PATH-Variable nicht so besetzt ist, wie du es aus der Konsole kennst.

Das heißt im Klartext, wenn du dieses Script als Cronjob laufen lassen willst, dann muss es wohl noch einmla komplett überdacht und überarbeitet werden.


robi
 
Oben