Archiv verlassen und diese Seite im Standarddesign anzeigen : Shellskript hilfe
Hallo, ich bin gerade dabei ein Backupskript für ein Webverzeichnis&Datenbank zuschrieben, allerdings hab ich noch ein paar Fragen, hier erstmal das Skript:
#!/bin/bash
###
### Configuration
###
# Website Files
webrootdir=/mnt/data/www/project_space/integration/salesinfo/
### Mail Adresse
email="mail@xxx.de"
ecc="mail@xxx.de"
esubject="Statusmeldung 1/2: $project Backup wurde gestartet"
emessage="/tmp/emailmessage.txt"
emessage2="/tmp/emailmessage2.txt"
### andere Infos
date=`date +'%Y-%m-%d'`
time2="`date +%H:%M:%S`"
time3="`date +%H-%M-%S`"
project=mellow
user="dein name"
user2="`whoami`"
system="`hostname`"
###Datenbank Einstellungen
dbname="xxx"
dbpass="xxx"
dbhost=localhost
dumpdb="typo3_xxx_dev_2007"
###
### Variables
###
# Default TAR Output File Base Name
tarnamebase=sitebackup-
datestamp=`date +'%Y-%m-%d'`
# Execution directory (script start point)
startdir=`pwd`
# Temporary Directory
tempdir=backup_$datestamp
###
### Input Parameter Check
###
if test "$1" = ""
then
tarname=$tarnamebase$datestamp.tgz
else
tarname=$1
fi
###
### Banner
###
echo ""
echo "Fullbackup"
#Statusmail 1/3 senden
echo -e "Hallo," >$emessage
echo -e "das Backup von Projekt '$project' wurde am $date/$time2 von $user ($user2) gestartet" >>$emessage
echo -e "" >>$emessage
echo -e "gesendet von $system" >>$emessage
# send an email using mail
mail -s "$esubject" "$email" -c "$ecc"< $emessage
# Create temporary working directory
echo " .. Setup"
mkdir $tempdir
echo " done"
echo " .. TARing website files in $webrootdir"
tar -cvf $startdir/$tempdir/filecontent.tar $webrootdir
echo " done"
### MySQLdump
mysqldump --user=$dbname --pass=$dbpass --host=$dbhost --add-drop-table $dumpdb gzip > $dumpdb.sql.gz
echo " .. Creating final compressed (tgz) TAR file: $tarname"
tar czf $startdir/$tarname $startdir/$tempdir/filecontent.tar $startdir/$dumpdb.sql.gz
echo " done"
###
### Cleanup
###
echo " .. Clean-up"
cd $startdir
rm -r $tempdir
echo " done"
#Statusmail 2/2 senden
echo -e "Hallo," >$emessage2
echo -e "das Backup von Projekt '$project' wurde am $date/$time2 abgeschlossen" >>$emessage2
################### Dateigröße einbauen
echo -e "" >>$emessage2
echo -e "gesendet von $system" >>$emessage2
# send an email using mail
mail -s "$esubject" "$email" -c "$ecc"< $emessage2
###
### Exit banner
###
echo " .. Full site backup complete"
echo ""
Es ist noch lange nicht perfekt, Verbesserungsvorschläge sind gern gesehen ;) Meine Frage ist jetzt noch kann man irgendwie in die Mail die Ausführungszeit mit reinschreiben lassen wie lange das packen und dumpen gedauert hat? Irgendwie geht das bestimmt per Time....
ich danke schonmal für die antworten
startDt=`date "+%s"`
#viel zu tun
endDt=`date "+%s"`
diffSec=$((endDt-startDt))
/edit: funtktioniert, danke
Wie kann ich noch die Dateigröße per drei Datein in die Mail übergeben?
Veierabend
23.06.08, 14:32
echo $diffSec
/edit: Da das ist klar, sorry habe deinen Beitrag nicht gesehen. Gebe es noch eine Möglichkeit zuüberprüfen ob das Verzeichnis, das gepackt werden soll sowiso die Datenbank vorhanden ist, bevor der Vorgang gestartete wird?
Veierabend
23.06.08, 15:01
test -d $ORDNER
Das ganze kannst du dann noch in ne if Anweisung verpacken. Dann brauchst auch kein test sondern nur
if [ -d $ORDNER ] usw.
SQL muss ich passen.
Danke, das mit dem Ordnertest habe ich eingebaut, ich meinte allerdings ein Test ob die MySQL Datenbank da ist, bzw ob der Login geht.
Update von Skript:
#!/bin/bash
###
### Configuration
###
# Website Files
webrootdir="/mnt/data/www/project_space/dev/xxx/0609-126/"
### Mail Adresse
email="mail@xxx.de"
#ecc="mail@xxx.de"
emessage="/tmp/emailmessage.txt"
emessage2="/tmp/emailmessage2.txt"
emessage3="/tmp/emailmessage3.txt"
### andere Infos
date=`date +'%Y-%m-%d'`
time2="`date +%H-%M-%S`"
project=mellow
user="dein name"
user2="`whoami`"
system="`hostname`"
###Datenbank Einstellungen
dbname="xxx"
dbpass="xxx"
dbhost=localhost
dumpdb="typo3_xxx_dev_2007"
###
### Test
###
if [ -d $webrootdir ]
then
###
### Variables
###
#Default TAR Output File Base Name
tarnamebase=$project-
datestamp=`date +'%Y-%m-%d'`
# Execution directory (script start point)
startdir=`pwd`
#Temporary Directory
tempdir=backup_$datestamp
###
### Input Parameter Check
###
if test "$1" = ""
then
tarname=$tarnamebase$datestamp.tgz
else
tarname=$1
fi
###
### Banner
###
echo ""
echo "Fullbackup"
#Statusmail 2/2 senden
echo -e "Hallo," >$emessage
echo -e "das Backup von Projekt '$project' wurde am $date/$time2 von $user ($user2) gestartet" >>$emessage
echo -e "" >>$emessage
echo -e "gesendet von $system" >>$emessage
#send an email using mail
mail -s "Statusmeldung 1/2: $procet Back wurde gestartet" "$email" -c "$ecc"< $emessage
# Create temporary working directory
echo " .. Setup"
mkdir $tempdir
echo " done"
start1=`date "+%s"`
echo " .. TARing website files in $webrootdir"
tar -cvf $startdir/$tempdir/filecontent.tar $webrootdir
echo " done"
ende1=`date "+%s"`
diffSec1=$((ende1-start1))
start2=`date "+%s"`
### MySQLdump
mysqldump --user=$dbname --pass=$dbpass --host=$dbhost --add-drop-table $dumpdb gzip > $startdir/$tempdir$/dumpdb.sql.gz
ende2=`date "+%s"`
diffSec2=$((ende2-start2))
start3=`date "+%s"`
echo " .. Creating final compressed (tgz) TAR file: $tarname"
tar czf $startdir/$tarname $startdir/$tempdir/filecontent.tar $startdir/$tempdir$/dumpdb.sql.gz
echo " done"
ende3=`date "+%s"`
diffSec3=$((ende3-start3))
diffSec4=$((diffSec1+diffSec2+diffSec3))
###
### Cleanup
###
echo " .. Clean-up"
cd $startdir
rm -r $tempdir
echo " done"
###
### Exit banner
###
echo " .. Full site backup complete"
echo
#Statusmail 2/2 senden
echo -e "Hallo," >$emessage2
echo -e "das Backup von Projekt '$project' wurde am $date/$time2 abgeschlossen, der Vorgang dauerte $diffSec4" >>$emessage2
echo -e "Das packen der Webseite dauerte $diffSec1 Sekunden, das dumpen der SQL Datenbank $diffSec2 und das finale packen $diffSec3 Sekunden." >>$emessage2
echo -e "" >>$emessage2
echo -e "gesendet von $system" >>$emessage2
# send an email using mail
mail -s "Statusmeldung 2/2: $procet Back wurde abgeschlossen" "$email" -c "$ecc"< $emessage2
else
#Status Nachicht seden
echo -e "Hallo," >$emessage3
echo -e "Das Verzeichnis $webrootdir ist nicht vorhanden, Backup abgebrochen" >>$emessage3
echo -e "gesendet von $system" >>$emessage3
# send an email using mail
mail -s "$Backup von $project abgebrochen!" "$email" -c "$ecc"< $emessage3
fi
Veierabend
23.06.08, 15:20
Aso naja mit MySQL hatte ich noch nicht wirklich was zu tun, also korrigier ich das mal fix...
Ok, jemand anders meinte das soll sich nicht einfach über Shell lösen lassen. Ich könne doch aber eine Abfrage einbauen und wenn der SQL Dump nicht da ist, bzw 0 Byte groß das dann der Skript abgebrochen wird? Wie macht das das?
danke nochmal für eure Hilfe
Hm, das Problem ist selbst wenn die Datenbank nicht vorhanden ist, wird eine Datei erstellt, mit etwas inhalt (3kb). Ist der Nutzername falsch ist die gepackte Datei auch 3kb groß, der inhalt ist jedoch leer
Dann hilft Dir evtl. $? weiter?
kannst du das etwas auführen bitte? ;)
http://tldp.org/LDP/abs/html/
http://tldp.org/LDP/abs/html/exit-status.html
$? gibt eine 0 zurück, hilft leider nichts. Als kleine Notlösung überprüfe ich nun die Zeit die der Dump brauch, sind es Null Sekunden, wird eine Warnmail geschickt.
Außerdem: Wie kann ich z.B. bei du -sh file, nur die Dateigröße rausbekommen, ebenso bei md5sum nur den Hash
$? gibt eine 0 zurück
$? gibt dir den Rückgabewert des letzen Kommandos
command
if test "0" -eq "$?" ;then echo "gut" ;else echo "schlecht" ;fi
oder gleich
if `command` ;then echo "gut" ;else echo "schlecht" ;fi
Außerdem: Wie kann ich z.B. bei du -sh file, nur die Dateigröße rausbekommen, ebenso bei md5sum nur den Hash
manchmal bringen die Tools schon Optionen mit nur "eine Seite" anzuzeigen.
man <toolname> hilft oft :cool:
Wenn es nicht anders geht muessen cut/sed und awk ran. Bevor Du damit
loslegst: es gibt viele interne Bash Funktionen die schon die Argumente
zerhacken. also z.B.:
403@2001:6f8:900:7c0::2_$ chmod +x tt
403@2001:6f8:900:7c0::2_$ ./tt foo baz
baz
403@2001:6f8:900:7c0::2_$ cat tt
echo "${@#$1}"
Lies mal mehr im schon von marce geposteten Advanced Bash Shell Scripting Guide ;)
Gruss
403
$? gibt eine 0 zurück, hilft leider nichts. Als kleine Notlösung überprüfe ich nun die Zeit die der Dump brauch, sind es Null Sekunden, wird eine Warnmail geschickt.
an welcher Stelle hast Du das denn nun eingefügt bzw. mit welchem Befehl getestet?
an welcher Stelle hast Du das denn nun eingefügt bzw. mit welchem Befehl getestet?
Nach dem MySQL Dump
$? gibt dir den Rückgabewert des letzen Kommandos
command
if test "0" -eq "$?" ;then echo "gut" ;else echo "schlecht" ;fi
oder gleich
if `command` ;then echo "gut" ;else echo "schlecht" ;fi
Das ist klar, nur 0 als Ausgabe bringt mir ja nichts. Da eben nicht alles ok ist
Dieses Skript soll dann auf einem Server laufen, ein andere soll das fertige Backup dann abholen.
Eine Idee wie man das am besten macht? Wäre praktisch wenn der eine Server den andern irgendwie informieren könnte das dass Backup fertig ist
Nach dem MySQL Dump
bitte den exakten Befehl.
So wie es im ersten Beitrag steht:
mysqldump --user=$dbname --pass=$dbpass --host=$dbhost --add-drop-table $dumpdb | gzip > $dumpdb.sql.gz
Hi!
So wie es im ersten Beitrag steht:
mysqldump --user=$dbname --pass=$dbpass --host=$dbhost --add-drop-table $dumpdb | gzip > $dumpdb.sql.gz
Dann empfängst du den Statuscode von gzip. Da das Komprimieren funktioniert hat, ist der Status natürlich 0 (kein Fehler).
Das ganze kannst du dann noch in ne if Anweisung verpacken. Dann brauchst auch kein test sondern nur
if [ -d $ORDNER ] usw.
[ ist nur ein Alias für test. Du kannst genauso if test ... oder [ ... ] && schreiben.
Dieses Skript soll dann auf einem Server laufen, ein andere soll das fertige Backup dann abholen.
Eine Idee wie man das am besten macht? Wäre praktisch wenn der eine Server den andern irgendwie informieren könnte das dass Backup fertig ist
Warum initiierst du nicht beide Prozesse von einem Rechner aus?
Gruß
fuffy
Dann empfängst du den Statuscode von gzip. Da das Komprimieren funktioniert hat, ist der Status natürlich 0 (kein Fehler).
Alles klar, eigentlich muss ich die Datenbank nicht noch extra packen, da das ja schon im nächsten Schritt passiert. Jetzt wird aber "2" ausgegeben.
mysqldump --user=$dbname --pass=$dbpass --host=$dbhost --add-drop-table $dumpdb > $startdir/$tempdir/$dumpdb.sql
echo $?
ausgegeben wird
mysqldump: Got error: 1044: Access denied for user 'xxx'@'localhost' to database 'typo3_xxx_dev_2007x' when selecting the database
2
Warum initiierst du nicht beide Prozesse von einem Rechner aus?
Das soll so sein (nicht meine Idee), jeder Server soll die Backups lokal machen und der eine Server holt dann nur die fertigen Backups ab
2 wird ausgegeben, weil Fehler war(der steht auch dadrueber) . Lies nochmal #15.
http://tldp.org/LDP/abs/html/exit-status.html
% chmod 0000 ttt
% ls ttt/ && echo $?
ls: ttt/: Permission denied
2
Gruss 403
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.