PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem mit einem Shellscript



Dziko
24.03.09, 18:31
Hallo zusammen, ich versuche mittels eines tutorials nun krampfhaft ein
mysqldump per shell aufzurufen, bekomme aber eine Fehlermeldung, womit ich
nicht wirklich was mit anfangen kann.

Da ich kompletter Neuling bin was Linux und Co angeht, hoffe ich das mir
jemand behilflich sein kann! :)

Also ich habe dieses Script hier: Link (http://www.synology-wiki.de/index.php/Backup_der_mySQL-Datenbank_%C3%BCber_einen_cronjob)

Ich habe das Script meinen verhältnissen angepasst:


#!/bin/bash
#
# dieses skript kann man beliebig oft ausführen
#
# anzahl der sicherungen die aufgehoben werden sollen
KEEP=2
BACKUPS=`find /volume1/mysqlbackups -name "mysqldump-*.gz" | wc -l | sed 's/\ //g'`
while [ $BACKUPS -ge $KEEP ]
do
ls -tr1 /volume1/mysqlbackups/mysqldump-*.gz | head -n 1 | xargs rm -f
BACKUPS=`expr $BACKUPS - 1`
done
DATE=`date +%Y%m%d%H%M%S`
rm -f /volume1/mysqlbackups/.mysqldump-${DATE}.gz_INPROGRESS
/usr/syno/mysql/bin/mysqldump --opt -uroot -pmysqlpasswort --all-databases | gzip -c -9 > /volume1/mysqlbackups/.mysqldump-${DATE}.gz_INPROGRESS
mv -f /volume1/mysqlbackups/.mysqldump-${DATE}.gz_INPROGRESS /volume1/mysqlbackups/mysqldump-${DATE}.gz
exit 0

nun bekomme ich nach dem Aufruf im SSH:


sh /volume1/shells/mysqlbackup.sh

folgende Fehlermeldung:


/volume1/shells/backup.sh: line 18: syntax error: unexpected end of file

Da dies alles wie gesagt, Neuland für mich ist bitte ich um Verständnis und hoffe das jemand mir hierbei helfen kann.

Anscheinend rufe ich das Shell-Script falsch auf? bzw. ist die Dateiendung nicht korrekt? :confused:

Ich habe einen virtuellen Server wo Linux Rat hat drauf läuft.

Freue mich auf Antwort, vielen Dank! :)

viele Grüße
André

cane
24.03.09, 18:48
/volume1/shells/backup.sh: line 18: syntax error: unexpected end of file

Was steht denn in Zeile 18? Poste am besten das ganze Script.


mfg
cane

HirschHeisseIch
24.03.09, 18:50
Wenn ich das richtig sehe, ist das Script ein 17-Zeiler. ;)

Poste am Besten das Script, _genau so_, wie es auf der Maschine liegt, auf der es auch ausgeführt wird...

Edit:
Oh ja, das Passwort darfst natürlich verfremden... ;)

Baui1984
24.03.09, 19:14
while [ $BACKUPS -ge $KEEP ];


Dir fehlt das Semikolon

Dziko
24.03.09, 19:20
Hallo,

also es ist eigentlich genau das Script wie es oben steht:



#!/bin/bash
#
# dieses skript kann man beliebig oft ausführen
#
# anzahl der sicherungen die aufgehoben werden sollen
KEEP=2
BACKUPS=`find /volume1/mysqlbackups -name "mysqldump-*.gz" | wc -l | sed 's/\ //g'`
while [ $BACKUPS -ge $KEEP ]
do
ls -tr1 /volume1/mysqlbackups/mysqldump-*.gz | head -n 1 | xargs rm -f
BACKUPS=`expr $BACKUPS - 1`
done
DATE=`date +%Y%m%d%H%M%S`
rm -f /volume1/mysqlbackups/.mysqldump-${DATE}.gz_INPROGRESS
/usr/syno/mysql/bin/mysqldump --opt -uroot -p --all-databases | gzip -c -9 > /volume1/mysqlbackups/.mysqldump-${DATE}.gz_INPROGRESS
mv -f /volume1/mysqlbackups/.mysqldump-${DATE}.gz_INPROGRESS /volume1/mysqlbackups/mysqldump-${DATE}.gz
exit 0


Hmm also es scheinen tatsächlich nur 17 Zeilen zu sein :confused:

Die Ordnerstuktur vom Hauptverzeichnis ausgehend:

Shell-Script: volume1/shells/backup.sh (Rechte zum ausführen vorhanden)
Backup-Verz: volume1/mysqlbackups/ (Schreibrechte vorhanden)

Zum Verständnis: Volume1 soll doch laut turorial ein ordner sein, muss dieser volume1 heissen oder ist das freiwählbar?

*edit*


while [ $BACKUPS -ge $KEEP ];


Dir fehlt das Semikolon

Hat leider nicht funktioniert, selber Fehler :confused:

viele Grüße
André

HirschHeisseIch
24.03.09, 19:27
Shell-Script: volume1/shells/backup.sh (Rechte zum ausführen vorhanden)
Backup-Verz: volume1/mysqlbackups/ (Schreibrechte vorhanden)

Zum Verständnis: Volume1 soll doch laut turorial ein ordner sein, muss dieser volume1 heissen oder ist das freiwählbar?


Ja, ist frei Wählbar...

Ich gehe jetzt einfach mal stark davon aus, dass der Pfad zu mysqldump auch nicht stimmt...

Pass das Script doch einfach mal (wie Du in #1 schon sagtest...) an Dein System an...

Dziko
24.03.09, 19:53
Ok, das scheint auf jedenfall ein Fehler zu sein..

..ich habe per SSH eigentlich bereits den mysqldump befehl ausgeführt und konnte auch testweise, erfolgreich ein msqldump erzeugen.

Nun soll mein mysqldump-programm in einem ordner liegen, wo kein solcher vorhanden ist.
Muss ich es für solche scripts, mysqldump noch mal "installieren"?

Oder gibt es vieleicht eine Möglichkeit, per SSH herauszufinden wo der pfad zum mysqldump ist?

viele Grüße
André

mborchi
24.03.09, 19:54
Oder gibt es vieleicht eine Möglichkeit, per SSH herauszufinden wo der pfad zum mysqldump ist?



which mysqldump

HirschHeisseIch
24.03.09, 19:55
which mysqldump

Edit:
mborchi war schneller...

Dziko
24.03.09, 20:03
Ok, das bringt mich ja schonmal ein Stück weiter :)



which mysqldump
'-> usr/bin/mysqldump


Habe es nun geändert,



#!/bin/bash
#
# dieses skript kann man beliebig oft ausführen
#
# anzahl der sicherungen die aufgehoben werden sollen
KEEP=2
BACKUPS=`find /volume1/mysqlbackups -name "mysqldump-*.gz" | wc -l | sed 's/\ //g'`
while [ $BACKUPS -ge $KEEP ];
do
ls -tr1 /volume1/mysqlbackups/mysqldump-*.gz | head -n 1 | xargs rm -f
BACKUPS=`expr $BACKUPS - 1`
done
DATE=`date +%Y%m%d%H%M%S`
rm -f /volume1/mysqlbackups/.mysqldump-${DATE}.gz_INPROGRESS
/usr/bin/mysqldump --opt -uroot -pmysqlpw --all-databases | gzip -c -9 > /volume1/mysqlbackups/.mysqldump-${DATE}.gz_INPROGRESS
mv -f /volume1/mysqlbackups/.mysqldump-${DATE}.gz_INPROGRESS /volume1/mysqlbackups/mysqldump-${DATE}.gz
exit 0


es kommt aber immer noch der selbe Fehler :confused:

HirschHeisseIch
24.03.09, 20:23
Okay...
Jetzt würd ich Dir noch empfehlen, ein Passwort zu nehmen, welches keine Raute (#) enthält... ;)

Dziko
24.03.09, 21:02
Ach mist, wart ihr schneller als ich editieren konnte *g*

Ich habe die datei mal direkt über mein SSH client editiert. Da habe ich gesehen das er merkwürdige Zeichen an das Ende jeder Zeile hinzugefügt hat:

^M

Das lag warscheinlich daran das ich hier offline Windows benutze und nur über ein Java-Applet so zugriff momentan habe. Ich wusste nicht das es da ebenfalls unterschiede zwischen den beiden OS gibt. (Wenn man win ein OS nennen kann *g*)

Ich habe nun die Zeichen über die entfernt indem ich mit



mc volume1/shells/backup.sh


die Datei aufgerufen und editiert habe!
Somit konnte das Script wie oben gepostet, erfolgreich anwenden!

Ich hoffe ich habe Euch hier nicht all zu doll in den Wahnsinn getrieben und bedanke mich für die nette und schnelle Hilfe! :)

*edit*
Ich werde mich mal nach einem guten freeware editor umschauen, welcher Dateien im UNIX Format abspeichern kann, wird warscheinlich daran gelegen haben, meinte zumindest mein Anbieter welchen ich ebenfalls nochmal zu der Problematik befragt habe.

Viele Grüße
André

Newbie314
24.03.09, 22:05
gvim

oder eine Emacs Variante

Painkiller
24.03.09, 22:13
Ein Kollege (Windowspro) schwoert auf Notepad++ als Editor.

Dziko
26.03.09, 18:28
Also mit Notepad++ scheint es auch geklappt zu haben! :)


Ich muss Eure Nerven aber noch einmal blank legen. ;)

Ich möchte dieses Script nun über ein Cronjob aufrufen lassen. Das Script funktioniert per manuellen Aufruf ja wunderbar!

Ich habe mit:

"crontab -e"

den Editor geöffnet und nun folgendes zur Ausführung i.d.F. 19:00 Uhr eingetragen:

0 <TAB> 19 <TAB> * <TAB> * <TAB> * <TAB> root <TAB> sh /volume1/shells/backup.sh

<TAB> habe ich natürlich nicht drin stehen, sondern an der Stelle immer mit dem Tabulator gearbeitet!

<ESC>-Taste, anschließend den vi-editor mit ":wq" geschlossen. Crontab wurde erfolgreich eingetragen.

Nochmal schnell nachgeschaut ob er wirklich drin steht "crontab -l"


0 19 * * * root sh /volume1/shells/backup.sh

Nun habe ich abgewartet, es scheint aber nichts zu passieren, eine Datei wird zumindest nicht angelegt :confused:

Hat jemand eine Idee wo es da noch haken könnte?

Viele Grüße
André

Baui1984
26.03.09, 18:52
Bei crontab -e lasst du den Benutzer weg, da du ja sowieso die Crontab des Benutzers bearbeitest. Damit ist auch klar als welcher User der Cron ausgeführt werden soll. Und du solltest absolute Pfade angeben

0 19 * * * /bin/sh /volume1/shells/backup.sh

Dziko
26.03.09, 19:07
Absolute Oberklasse, ich bedanke mich recht herzlich! Hat wunderbar geklappt! :)

viele Grüße
André