PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Shellskript hilfe



Shy'est
23.06.08, 09:28
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

rudi_m
23.06.08, 11:43
startDt=`date "+%s"`
#viel zu tun
endDt=`date "+%s"`
diffSec=$((endDt-startDt))

Shy'est
23.06.08, 13:21
/edit: funtktioniert, danke
Wie kann ich noch die Dateigröße per drei Datein in die Mail übergeben?

Veierabend
23.06.08, 13:32
echo $diffSec

Shy'est
23.06.08, 13:45
/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, 14: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.

Shy'est
23.06.08, 14:16
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, 14:20
Aso naja mit MySQL hatte ich noch nicht wirklich was zu tun, also korrigier ich das mal fix...

rudi_m
23.06.08, 14:49
du -sh datei

Shy'est
23.06.08, 14:52
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

marce
23.06.08, 15:55
schau Dir mal test an...

Shy'est
23.06.08, 16:16
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

marce
23.06.08, 16:23
Dann hilft Dir evtl. $? weiter?

Shy'est
23.06.08, 16:25
kannst du das etwas auführen bitte? ;)

marce
23.06.08, 16:27
http://tldp.org/LDP/abs/html/
http://tldp.org/LDP/abs/html/exit-status.html

Shy'est
23.06.08, 16:34
$? 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

rudi_m
24.06.08, 00:15
$? 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

403
24.06.08, 02:30
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

marce
24.06.08, 05:44
$? 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?

Shy'est
24.06.08, 09:11
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

marce
24.06.08, 10:03
Nach dem MySQL Dump
bitte den exakten Befehl.

Shy'est
24.06.08, 10:08
So wie es im ersten Beitrag steht:

mysqldump --user=$dbname --pass=$dbpass --host=$dbhost --add-drop-table $dumpdb | gzip > $dumpdb.sql.gz

fuffy
24.06.08, 10:36
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

Shy'est
24.06.08, 10:49
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

403
24.06.08, 17:29
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