PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Innerhalb eines Skriptes mit den Programmausgaben arbeiten: Wie genau?



qeldroma
26-04-2006, 10:02
Hallo zusammen,

ich möchte innerhalb eines Backup-Skriptes mehrerer hosts(/etc/backup/hosts.cfg) auf die Ausgabe von rsync reagieren. Das Ergebnis wird gemailt..

Folgendes mein Ziel:
Wenn rsync erfolgreich ist, steht in einem String nur eine Bestätigung des Backups.
Sollte rsync irgendeine Ausgabe liefern, so soll diese gespeichert werden, eine Fehlertext und dann die Ausgabe angefügt werden. Anschließend soll das Skript aber weiter fortfahren(nächster host).

Mein Weg scheint nicht zu funktionieren, denn am Beispiel der hosts 192.168.0.1 - 8 - wobei 192.168.0.7 nicht existiert - sollte das Skript also einen Fehler protokollieren. Trotzdem wird der Host als "succeeded" angezeigt und die Fehlerausgabe von rsync landet in der Konsole :(


#!/bin/bash
exclude="/etc/backup/exclude.cfg"
exclude_tmp="/tmp/bak.tmp"
nice="19"
what="/"
bak_path="/BACKUP"
options="-a --delete"

mailtext=$(cat /etc/backup/hosts.cfg|while read host; do
where="$bak_path/$host/`date +%u`"
exclude_ip_file="/etc/backup/$host.cfg"
cat "$exclude" > "$exclude_tmp"
cat "$exclude_ip_file" >> "$exclude_tmp"
mkdir -p "$where"
output="`nice -n $nice /usr/bin/rsync $options --exclude-from="$exclude_tmp" $host:$what $where`"
if [ ! "$output" ]; then
echo "**** Host $host succeeded."
else
echo -e "!!!! Host $host failed\nOutput was:\n$output"
fi
touch $where
touch $bak_path/$host
done)

mailtext="*************************************\n** Nagios - Backupresults **********\n\n`date`\n$mailtext"
/usr/bin/printf "%b" "$mailtext" | /bin/mail -s "DAILY BACKUP RESULTS" technik55@dummy.net

peschmae
26-04-2006, 10:12
Vermutlich gibt rsync seine Fehlermeldung auf den stderr stream aus und nicht auf stdout. Per default wird bei einem Auführen mit $() oder ` ` aber nur der Stdout an dich zurückgegeben. Du kannst aber z.B. den stderr nach stdout umleiten à la:


VAR=$(rsync -asdf 2<&1)

Ob rsync fehlgeschlagen hat findest du eventuell auch mit dem Rückgabewert des Programms ganz praktisch raus. Der ist direkt nach dem Aufruf in der variable $? zu finden. Direkter gehts dann auch in der Art von


if OUTPUT=$(rsync ... 2<&1); then

das dann testet ob der Rückgabewert von Rsync 0 oder nicht 0 war. (Ein anständiges Programm gibt 0 zurück wenn es erfolgreich war und einen Fehlercode != 0 wenn es fehlschlug)

MfG Peschmä

Sid
26-04-2006, 13:28
Du hast nen kleinen Tippfehler drin, das ist 2>&1, oder?

peschmae
26-04-2006, 15:26
Macht beides dasselbe :)

Zugegebenermassen ist 2>&1 logischer aber irgendwie hab ich mir 2<&1 angewöhnt :D

MfG Peschmä

qeldroma
26-04-2006, 15:48
Danke ;) Klappt nun!

Grüße, Florian