brauche bisschen Hilfe für ein Shellscript

jeipack

Erfahrenes Mitglied
Moinmoin
Habe hier ein kleines aber feines Shellscript welches mir bestimmte MySQL DBs sichert:

Code:
#!/bin/sh
datum=`date +%d%m%y`
for item in `mysql < show | grep kdu*`
do
mysqldump --opt --single-transaction --hex-blob $item > /home/sqldumps/$item"_"$datum.sql
echo saved $item
done
Der Inhalt der Datei show:
Code:
show databases where `Database`like 'kdu%' and `Database`<>'kdu_xxx_test' and `Database`<>'kdu_000_nullversion'

Nun aber noch ein paar Fragen:
1. kann ich den Inhalt der Datei show ihrgendwie direkt in das Shellscript integrieren?

2. Wie bekomme ich die erstellten SQL Files nun am besten und einfachsten auf einen Win2k3 Server? Mir wurde gesagt mit SCP, doch dies funktioneirt ja nur zwischen Unixen.

3. Wie bringe ich cron dazu dieses Script aus zu führen?
Ich versuchte:
crontab -e
und gab dann folgendes ein: 28 10 * * * /root/scripts/savekdus.sh (Die Zeit war nur um zu testen ob es ausgeführt wird)
crontab -l bestätigt mir meine Eingabe.
Nun machte ich noch ein /etc/init.d/cron reload
Das Script wurde aber um 10:28:00 nicht ausgeführt..

Ein Aufruf von "ps -aux" zeigt mir an, dass /usr/sbin/cron mit der pid 6767 am laufen ist.

Ein Aufruf von "cron" gibt folgendes aus:
cron: can't lock /var/run/crond.pid, otherpid may be 6767: Resource temporarily unavailable
(Keine Ahnung ob das ein Fehler ist oder nicht)


Hoffe ihr könnt mir ein paar Tipps geben :) Wobei Punkt 3 die höchste Priorität hat.

Gruss und vielen Dank
jeipack
 
Nun aber noch ein paar Fragen:
1. kann ich den Inhalt der Datei show ihrgendwie direkt in das Shellscript integrieren?
Es gibt verschiedene Möglichkeiten. Wenn du Bash benutzt, könntest du einen Here-String benutzen:
Bash:
mysql <<<'show databases where ...' | grep ...

Oder du benutzt ein Here-Document:
Bash:
{ mysql <<'EOF'
show databases where ...
EOF 
} | grep ...

2. Wie bekomme ich die erstellten SQL Files nun am besten und einfachsten auf einen Win2k3 Server? Mir wurde gesagt mit SCP, doch dies funktioneirt ja nur zwischen Unixen.
Das funktioniert auch bei Windows, man muß nur einen SSH Server installieren (siehe http://sshwindows.sourceforge.net/).

Andere Möglichkeit wäre z.B. Samba. Dann kann man die Dateien auf eine Freigabe kopieren.

3. Wie bringe ich cron dazu dieses Script aus zu führen?
Ich versuchte:
crontab -e
und gab dann folgendes ein: 28 10 * * * /root/scripts/savekdus.sh (Die Zeit war nur um zu testen ob es ausgeführt wird)
crontab -l bestätigt mir meine Eingabe.
Nun machte ich noch ein /etc/init.d/cron reload
Das Script wurde aber um 10:28:00 nicht ausgeführt..
War das Skript ausführbar (chmod +x)?

Ein Aufruf von "ps -aux" zeigt mir an, dass /usr/sbin/cron mit der pid 6767 am laufen ist.

Ein Aufruf von "cron" gibt folgendes aus:
cron: can't lock /var/run/crond.pid, otherpid may be 6767: Resource temporarily unavailable
(Keine Ahnung ob das ein Fehler ist oder nicht)
Dadurch das bereits ein cron lief und demnach die PID Datei bereits gelockt ist, war dieser Fehler zu erwarten.

Gruß
 
Guten Morgen deepthroat
Vielen Dank für deine Hilfe, leider klappt es noch nicht ganz.
1. Mit diesem Here-String /Here-Dokument funktioniert es, solange keine Anführungszeichen(' , `) drin vorkommen .
also ein `mysql <<< 'show databases' ` funktioniert.
aber sobald ich sowas schreibe: `mysql<<< 'show databases where `Database` like 'kdu%''` funktioniert es nicht mehr :/
Die Fehlermeldung lautet:
Code:
./savekdus.sh: command substitution: line 9: unexpected EOF while looking for matching `''
./savekdus.sh: command substitution: line 10: syntax error: unexpected end of file
Wobei line 9 die letze Zeile des Files ist.

2. Nun, dann werd ich mir mal überlegen was am besten ist.

3. Das Script ist ausführbar und kann von Hand auch gestartet werden.
Zudem bemerke ich gerade, dass das Script gestern ausgeführt worden ist, somit hat sich dies erledigt :)
Noch eine kleine Frage, wenn ich crontab -e ausführ und das File anpasse, muss dann immer auch ein "/etc/init.d/cron reload" ausgeführt werden damit er die neuen Anpassungen kennt?

Gruss und einen guten Wochenstart
jeipack
 
Morgen.
Guten Morgen deepthroat
Vielen Dank für deine Hilfe, leider klappt es noch nicht ganz.
1. Mit diesem Here-String /Here-Dokument funktioniert es, solange keine Anführungszeichen(' , `) drin vorkommen .
also ein `mysql <<< 'show databases' ` funktioniert.
aber sobald ich sowas schreibe: `mysql<<< 'show databases where `Database` like 'kdu%''` funktioniert es nicht mehr :/
Die Fehlermeldung lautet:
Code:
./savekdus.sh: command substitution: line 9: unexpected EOF while looking for matching `''
./savekdus.sh: command substitution: line 10: syntax error: unexpected end of file
Wobei line 9 die letze Zeile des Files ist.
Kann es sein, das du die falschen Anführungsstriche verwendest? Es ist ein Unterschied ob du ` oder ' nimmst.

Falls du im Befehl auch einfach Anführungsstriche verwenden mußt, kannst du doppelte Anführungsstriche um den gesamten Befehl verwenden. Dann mußt du aber mit allen sonstigen Spezialzeichen der Shell (! $ `) aufpassen - diese müssen extra entwertet werden:
Bash:
mysql <<< "show databases where 'Database' like 'kdu%'"

Gar keine Rolle spielen die Anführungszeichen beim Here-Document - solange das Wort hinter den << in Anführungszeichen steht, werden die Zeilen nicht expandiert.
Noch eine kleine Frage, wenn ich crontab -e ausführ und das File anpasse, muss dann immer auch ein "/etc/init.d/cron reload" ausgeführt werden damit er die neuen Anpassungen kennt?
Nein, mußt du nicht. (Das dürfte ein normaler Benutzer ja sowieso nicht...)

Gruß

PS: Bitte verwende doch die Code Tags für Code oder Befehle die du postest. Dann kann man das auch alles viel besser lesen.
 
Nun, ich habe beide Zeichen verwendet:
' für Strings im SQLStatement
` für Tabellennamen, die gleichzeitig auch als MySQL Syntax bekannt sind.
Dies hat sich aber in zweierlei Hinsicht erledigt. Mit den " funktioniert es, und zudem sieht es so aus, dass ich die zu sicherernden Datanbanken nicht mehr selektieren muss und gleich alle nehmen kann.

Mein Script sieht nun wie folgt aus:

Code:
#!/bin/sh
datum=`date +%d%m%y`
echo $datum
#mkdir /home/sqldumps/$datum
for item in `mysql <<<'show Databases;'`
do
  if [ "$item" != "Database" ] ; then
    mysqldump --opt --single-transaction --hex-blob $item > /home/sqldumps/$datum"/"$item"_"$datum.sql
    echo saved $item
  fi
done
cd /home/sqldumps/$datum

ftp -p -n 192.168.0.51 <<'END_FTP1'
quote USER SQL-Backup
quote PASS ...
cd /SQLBackup
mkdir $datum
bye
END_FTP1

for sqlfile in `ls`
do
  echo $sqlfile
  ftp -p -n 192.168.0.51 <<'END_FTP2'
  quote USER SQL-Backup
  quote PASS ...
  cd /SQLBackup/$datum
  put $sqlfile
  bye
  END_FTP2
done

Als Filetransfer hab ich mich für FTP entschieden. Die erste FTP Anweisung funktioniert und das Verzeichnis wird erstellt.
Die zweite FTP Anweisung funktioniert nicht. Fehlermeldung:
Code:
 syntax error: unexpected end of file
Wobei der Fehler nicht auftritt, wenn die FTP Anweisung nicht in der for-Schleife ist.
Desweiteren wäre es natürlich noch schöner, wenn ich die for-Schleife in der FTP-Anweisung machen kann, also etwa so:
Code:
ftp -p -n 192.168.0.51 <<'END_FTP2'
  quote USER SQL-Backup
  quote PASS ...
  cd /SQLBackup/$datum
  for sqlfile in `ls`
  do
    put $sqlfile
  done
  bye
  END_FTP2
So würde nicht für jedes File die FTP Sitzung neu aufgebaut. Weisst du was ich meine?

Gruss und vielen Dank schonmal für deine Hilfe!
jeipack
 
Hi
was mir auch noch aufgefallen ist:
Code:
datum=`date +%d%m%y`
ftp -p -n 192.168.0.51 <<END_FTP1
quote USER SQL-Backup
quote PASS ..
cd /SQLBackup
mkdir $datum
bye
END_FTP1
Dieser Code erstellt einen Ordner auf dem FTP Server mit dem in der ersten Linie erstelltem Datumsstring.

Code:
datum=`date +%d%m%y`
ftp -p -n 192.168.0.51 <<'END_FTP1'
quote USER SQL-Backup
quote PASS ..
cd /SQLBackup
mkdir $datum
bye
END_FTP1
Bei diesem Code wird der Ordner auf dem FTPServer mit den Namen "$datum" erstellt. Unterschied der beiden Codes sind nur die Anführungszeichen in der zweiten Linie bei END_FTP1.
Darf ich dies nun einfach ohne Anführungszeichen lassen oder ist dies theoretisch ein Fehler? Wie wird dies korret gemacht?


Gruss
 
Bei diesem Code wird der Ordner auf dem FTPServer mit den Namen "$datum" erstellt. Unterschied der beiden Codes sind nur die Anführungszeichen in der zweiten Linie bei END_FTP1.
Darf ich dies nun einfach ohne Anführungszeichen lassen oder ist dies theoretisch ein Fehler? Wie wird dies korret gemacht?
Wie bereits gesagt:
solange das Wort hinter den << in Anführungszeichen steht, werden die Zeilen nicht expandiert.
D.h.: Ja, man darf die Anführungszeichen weglassen, dann werden die Zeilen wie bereits erwähnt expandiert (Variablenexpansion, Kommandoexpansion, arithm. Expansion, ...).

Dann muß man aber mit den sonstigen Sonderzeichen der Shell aufpassen und muss diese entsprechend entwerten wenn sie nicht von der Shell interpretiert werden sollen.

:google: Du solltest ruhig mal einen Blick in die Handbuchseiten von bash werfen - da steht das alles sehr schön drin.

Gruß
 
Morgen deepthroat
Nun, ich habe schon in einigen manpages was nachgelesen und auch schon gegooglet. Leider hab ich das mit der zweiten FTP Verbindung trozdem nicht hinbekommen.

Versucht habe ich unter anderem auch:
Code:
mput *.sql y
Nur werde ich trozdem gefragt, ob ich die Datei wirklich hochladen will :/

In einer Schleife funktioniert das ganze nicht, von daher bin ich leider relativ ratlos :/

Wenn du mir also helfen kannst die Files via FTP ihrgendwie automatisiert hoch zu laden wäre ich sehr froh.

Gruss
jeipack
 
jo die Option hab ich schon gesehen, wusste aber nicht was das zu bedeuten hat. Nun hab ich zuvor den Befehl prompt gesehen und auch verstanden^^, der anscheinend genau das gleiche macht.

Naja.. viele Dank
manchmal sucht man halt wirklich am falschen Ort.

Gruss
 

Neue Beiträge

Zurück