PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Mount-Kopier-Neustart Script



Andislack
13.02.04, 03:29
Hi!

Ich brauche ein Skript, welches mir ein Windows Share mountet, eine Datei kopiert, einen Datenbankserver neustartet und dann das Windows Share wieder unmountet.
Das Skript soll dann alle 2-3 h per cron einmal aufgerufen werden.

Jetzt hab ich mal ein ganz simples "Skript" geschrieben:

#!/bin/sh

#Windows-Share mounten mit Benutzer und Passwort
mount -t smbfs -o username=andi,password=xxx //tingeltangelbob/System /daten

#Datei von dem Windows-Share kopieren
cp /daten/DemoFact/GDI.GDB /home/andi

#Interbase-DB neustarten
killall ibserver

#Windows-Share entmounten
umount /mbm


Das funktioniert auch soweit, dass er mountet und die Datei kopiert, allerdings startet er der DB-Server nicht neu und entmountet auch nicht das Verzeichnis.
Auch keine Meldungen auf der Konsole oder in /var/log/messages...
killall ibserver deshalb, weil ein guard auf dem interbase-server lauscht und ihn neustartet, sobald er abgestürzt ist oder ähnliches.

Mein Skript führt die letzten beiden Befehle nicht aus...woran kann das liegen?

Vielen Dank für eure Antworten
Gruss Andi

Ghostblade0
13.02.04, 06:57
Morgen... :p

du must das script auf jeden fall als root ausführen!
(wenns dann in der crontab steht, macht es das ja so und so)

killall ist ja eigendlich ein befehl zum abbrechen von programmen... deshalb versteh ich nicht wieso du damit deine db neu starten willst :confused:

gibts für diese db kein start/stop script?

bringt er keine fehlermeldungen?

DarkSorcerer
13.02.04, 07:11
Original geschrieben von Andislack

#!/bin/sh

#Windows-Share mounten mit Benutzer und Passwort
mount -t smbfs -o username=andi,password=xxx //tingeltangelbob/System /daten

#Datei von dem Windows-Share kopieren
cp /daten/DemoFact/GDI.GDB /home/andi

#Interbase-DB neustarten
killall ibserver

#Windows-Share entmounten
umount /mbm


Warum den Dienst killen? Ich nehme an das es für Interbase ein Startscript gibt, also einfach


/etc/init.d/ibserver restart


Um das Winshare auszuhängen musst du auch den richtigen Mountpoint angeben, also


umount /daten

wie kommst du auf mbm?

Andislack
13.02.04, 09:15
Hi!

also das mit dem falschen Verzeichnis umounten war ein post Fehler von mir.
Ich versuche schon das richtige auszuhängen:
mount -t smbfs -o username=andi,password=xxx //tingeltangelbob/System /mbm
#Datei von dem Windows-Share kopieren
cp /daten/DemoFact/GDI.GDB /home/andi
#Interbase-DB neustarten
killall ibserver
#Windows-Share entmounten
umount /mbm

ich habe nur ein wenig mit den Verzeichnissen probiert und dann vergessen das hier im post anzupassen.

Nunja, es gibt bei interbase den ibguard und der lässt sich nur mit folgenden optionen starten:
ibguard --help
Usage: ibguard [-signore | -onetime | -forever (default)]

Der startet dann den eigentlichen interbase-server.
Bei dem gibts kein start|stop|restart

Doch da sollte ja eigentlich nicht das Problem liegen, denn wenn der eigentliche interbase-server durch den killall gekillt wird, dann startet der ibguard ihn ja wieder neu.
Nur wird dieser Befehl genauso wie der umount Befehl nach dem kopieren nicht mehr ausgeführt.
Das Skript hat die richtigen Rechte und wird auch nur als root ausgeführt.

DarkSorcerer
13.02.04, 09:23
Setze den killall Befehl mit einem "&" in den Hintergrund. Der umount sollte klappen, daher denke ich das das killen des Servers ein Problem macht. Du kannst ja auch mal eine Fehlerumleitung nach /dev/null machen. vielleicht hilft das weiter

Andislack
27.02.04, 04:14
Hi!

Hat ein bisschen länger gedauert das Testen...hat aber wunderbar funktioniert mit dem & und ab in den Hintergrund.
Jetzt hab ich aber ein neues Problem. Ich hab mein Script um einiges erweitert, leider springt er die if then else Abfragen nicht so ab wie ich das möchte...:

-------Das Script:----------------

#!/bin/sh

dbname=GDI.GDB
stamp=$(date +%m_%d_%Y)
zeit=$(date +%H:%M)
filename=$dbname.$stamp.bak.0
filename1=$dbname.$stamp.bak.1
pfad=/mbm/mountgdb/

LOGFILE=$pfad$stamp.$zeit.dbtrans.log

#if [ -e $pfad$filename.gz ]; then
# echo $filename.gz
# dbexists=vorhanden
#fi

# Verzeichnis des GDI-Servers Mounten
mount -t smbfs -o username=xxx,password=xxx //mbm-Server/GDI-Software /mbm/GDISERVER

if [ $?=0 ]; then
stamp=$(date +%m_%d_%Y)
zeit=$(date +%H:%M)
echo $stamp $zeit "Verzeichnis erfolgreich gemountet" > $LOGFILE
fi

# Datei GDI.GDB kopieren und umbenennen
cp /mbm/GDISERVER/GDILine/Daten/GDI.GDB $pfad$dbname

#cp /opt/interbase/examples/employee.gdb $pfad$dbname

if [ $?=0 ]; then
stamp=$(date +%m_%d_%Y)
zeit=$(date +%H:%M)
echo $stamp $zeit "Datenbank $filename erfolgreich kopiert" >> $LOGFILE
else
echo $stamp $zeit "Das Kopieren der Datenbank $dbname hat nicht funktioniert," >> $LOGFILE
echo $stamp $zeit "wahrscheinlich konnte das Verzeichnis nicht gemountet werden..." >> $LOGFILE
fi

# Verzeichnis des GDI-Servers wieder entmounten
stamp=$(date +%m_%d_%Y)
zeit=$(date +%H:%M)
echo $stamp $zeit "Es wird versucht das Server-Verzeichnis zu entmounten..." >> $LOGFILE
umount /mbm/GDISERVER

if [ $?=0 ]; then
stamp=$(date +%m_%d_%Y)
zeit=$(date +%H:%M)
echo $stamp $zeit "Verzeichnis erfolgreich entmountet" >> $LOGFILE
fi

# Von der Datenbank wird versucht ein Backup zu erstellen

if [ -e $pfad$filename ]; then
gbak -B $pfad$dbname $pfad$filename1
else
gbak -B $pfad$dbname $pfad$filename
fi

if [ $?!=0 ]; then
stamp=$(date +%m_%d_%Y)
zeit=$(date +%H:%M)
echo $stamp $zeit "Von der Datenbank konnte kein Backup erstellt werden, es wird versucht zu reparieren" >> $LOGFILE

gfix -m -f $pfad$dbname

if [ $?!=0 ]; then
echo $stamp $zeit "Reparatur hat funktioniert" >> $LOGFILE
else
echo $stamp $zeit "Reparatur hat NICHT funktioniert" >> $LOGFILE
fi

if [ -e $pfad$filename ]; then
gbak -B $pfad$dbname $pfad$filename1
else
gbak -B $pfad$dbname $pfad$filename
fi

if [ $?=0 ]; then
stamp=$(date +%m_%d_%Y)
zeit=$(date +%H:%M)
echo $stamp $zeit "Backup der Datenbank erfolgreich" >> $LOGFILE
else
echo $stamp $zeit "Backup konnte trotz Reparaturversuch nicht erstellt werden" >> $LOGFILE
fi
fi

# Datenbank zippen

if [ -e $pfad$filename.gz ]
then
gzip -f $pfad$filename1

if [ $?=0 ]
then
stamp=$(date +%m_%d_%Y)
zeit=$(date +%H:%M)
echo $stamp $zeit "Backup $filename erfolgreich gezipt" >> $LOGFILE
fi
else
gzip -f $pfad$filename
#echo "Fehler"
fi

Das Problem ist jetzt, dass er immer beide Abfragen mitnimmt, also er springt in if rein und führt den Befehl aus und auch in else und führt dort ebenfalls den Befehl aus
Kann mir da mal jemand die "richtige" Syntax verraten?
Oder meine Logikfehler aufdecken...

Ein weiteres Problem welches ich noch nicht in den Griff bekommen habe, ist immer ins gleiche Logfile zu schreiben. Ich lasse im mom immer ein neues anlegen.
Wie öffne ich eine Datei, setze evtl. den Dateizeiger um und schreibe dann hinten dran?

Wäre nett wenn sich das mal jemand anschauen könnte...
Verbesserungsvorschläge herzlichst erwünscht ;)
Danke Andi

Ghostblade0
27.02.04, 08:14
Morgen...

sorry aber das is mir heut morgen zu viel text... :ugly:

also der syntax für if ist so

if [...]; then
<anweisung>
else
<anweisung>
fi

(die <> zählen nicht)

wenn du in einem logfile weiterschreiben willst must du z.B. :

>> /home/logfile

oder so machen (du schreibst erst in ne variable... muß aber trotzdem gehn...)
an sonsten versuch es mal ohne variable und nim dafür die pfadangabe des logfiles.

Andislack
01.04.04, 02:44
Hi wiedermal!

Also mein Script ist etwas merkwürdig...
Wenn ich es von Hand aufrufe, funktioniert alles wunderbar, lasse ich es durch einen Cron eintrag starten, funktioniert die allerletzte IF Abfrage nicht :confused:

Also hier nochmal mein aktuelles Script:

#!/bin/sh
dbname=GDI.GDB
stamp=$(date +%m_%d_%Y)
zeit=$(date +%H:%M)
filename=$dbname.$stamp.bak
pfad=/mbm/mountgdb/

logname=dbtrans.log

#LOGFILE=$pfad$stamp.$zeit.dbtrans.log
LOGFILE=$pfad$logname

# Verzeichnis des GDI-Servers Mounten
mount -t smbfs -o username=linux,password=xxx //mbm-Server/GDI-Software /mbm/GDISERVER

if [ $?=0 ]; then
stamp=$(date +%m_%d_%Y)
zeit=$(date +%H:%M)
if [ -e $pfad$logname ]; then
echo "" >> $LOGFILE
echo "" >> $LOGFILE
echo $stamp $zeit "Verzeichnis erfolgreich gemountet" >> $LOGFILE
else
echo $stamp $zeit "Verzeichnis erfolgreich gemountet" > $LOGFILE
fi
fi

# Datei GDI.GDB kopieren und umbenennen
cp /mbm/GDISERVER/GDILine/Daten/GDI.GDB $pfad$dbname

#cp /opt/interbase/examples/employee.gdb $pfad$dbname

if [ $?=0 ]; then
stamp1=$(date +%m_%d_%Y)
zeit1=$(date +%H:%M)
echo $stamp1 $zeit1 "Datenbank $filename erfolgreich kopiert" >> $LOGFILE
else
echo $stamp1 $zeit1 "Das Kopieren der Datenbank $dbname hat nicht funktioniert," >> $LOGFILE
echo $stamp1 $zeit1 "wahrscheinlich konnte das Verzeichnis nicht gemountet werden..." >> $LOGFILE
fi

# Verzeichnis des GDI-Servers wieder entmounten
stamp2=$(date +%m_%d_%Y)
zeit2=$(date +%H:%M)
echo $stamp2 $zeit2 "Es wird versucht das Server-Verzeichnis zu entmounten..." >> $LOGFILE
umount /mbm/GDISERVER

if [ $?=0 ]; then
echo $stamp2 $zeit2 "Verzeichnis erfolgreich entmountet" >> $LOGFILE
fi

# Von der Datenbank wird versucht ein Backup zu erstellen

gbak -B $pfad$dbname $pfad$filename

if [ $?!=0 ]; then
stamp3=$(date +%m_%d_%Y)
zeit3=$(date +%H:%M)
echo $stamp3 $zeit3 "Von der Datenbank konnte kein Backup erstellt werden, es wird versucht zu reparieren" >> $LOGFILE

gfix -m -f $pfad$dbname

if [ $?!=0 ]; then
stamp4=$(date +%m_%d_%Y)
zeit4=$(date +%H:%M)
echo $stamp4 $zeit4 "Reparatur hat funktioniert" >> $LOGFILE
else
echo $stamp4 $zeit4 "Reparatur hat NICHT funktioniert" >> $LOGFILE
fi

gbak -B $pfad$dbname $pfad$filename

if [ $?=0 ]; then
stamp5=$(date +%m_%d_%Y)
zeit5=$(date +%H:%M)
echo $stamp5 $zeit5 "Backup der Datenbank erfolgreich" >> $LOGFILE
else
echo $stamp5 $zeit5 "Backup konnte trotz Reparaturversuch nicht erstellt werden" >> $LOGFILE
fi
fi

# Datenbank zippen

gzip -f $pfad$filename

if [ $?=0 ]; then
stamp6=$(date +%m_%d_%Y)
zeit6=$(date +%H:%M)
echo $stamp6 $zeit6 "Backup $filename erfolgreich gezipt" >> $LOGFILE
else
echo $stamp6 $zeit6 "Backup $filename konnte nicht gezippt werden" >> $LOGFILE
fi

if [ -e $pfad$filename.gz ]; then
stamp7=$(date +%m_%d_%Y)
zeit7=$(date +%H:%M)

rm /mbm/mountgdb/gdb/GDI.GDB*
echo $stamp7 $zeit7 "Das Verzeichnis /mbm/mountgdb/gdb/ wurde geleert" >> $LOGFILE

mv $pfad$filename.gz /mbm/mountgdb/gdb/
echo $stamp7 $zeit7 "Die DB wurde verschoben" >> $LOGFILE
else
echo "Die gezippte Datenbank ist nicht vorhanden [$pfad$filename]" >> $LOGFILE
fi

dieser Eintrag ist in der crontab von root drin:
30 0,12 * * * /usr/sbin/mountgdb

diese Rechte hat das Script:
-rwxr-xr-x 1 root bin 3171 Mar 29 02:12 mountgdb

Das steht in dem LOGFILE nach manuellem Aufruf:
03_23_2004 13:45 Verzeichnis erfolgreich gemountet
03_23_2004 13:46 Datenbank GDI.GDB.03_23_2004.bak erfolgreich kopiert
03_23_2004 13:46 Es wird versucht das Server-Verzeichnis zu entmounten...
03_23_2004 13:46 Verzeichnis erfolgreich entmountet
03_23_2004 14:01 Von der Datenbank konnte kein Backup erstellt werden, es wird versucht zu reparieren
03_23_2004 14:03 Reparatur hat funktioniert
03_23_2004 14:17 Backup der Datenbank erfolgreich
03_23_2004 14:19 Backup GDI.GDB.03_23_2004.bak erfolgreich gezipt
03_23_2004 14:19 Das Verzeichnis /mbm/mountgdb/gdb/ wurde geleert
03_23_2004 14:19 Die DB wurde verschoben


und das hier, wenn das Script über crontab aufgerufen wird:
03_29_2004 12:30 Verzeichnis erfolgreich gemountet
03_29_2004 12:30 Datenbank GDI.GDB.03_29_2004.bak erfolgreich kopiert
03_29_2004 12:30 Es wird versucht das Server-Verzeichnis zu entmounten...
03_29_2004 12:30 Verzeichnis erfolgreich entmountet
03_29_2004 12:30 Von der Datenbank konnte kein Backup erstellt werden, es wird versucht zu reparieren
03_29_2004 12:30 Reparatur hat funktioniert
03_29_2004 12:30 Backup der Datenbank erfolgreich
03_29_2004 12:30 Backup GDI.GDB.03_29_2004.bak erfolgreich gezipt
Die gezippte Datenbank ist nicht vorhanden [/mbm/mountgdb/GDI.GDB.03_29_2004.bak]


Ich hab keine Ahnung wo da der Fehler stecken könnte :confused:
Vielleicht sieht da ja jemand was...

Vielen Dank schonmal
Gruss Andi