Errorlevelauswertung im Backupscript läuft noch nicht ganz "rund"

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
altmetaller
Beiträge: 108
Registriert: 03.02.2017 12:28:41

Errorlevelauswertung im Backupscript läuft noch nicht ganz "rund"

Beitrag von altmetaller » 06.02.2018 15:41:24

Hallo,

ich habe "eigentlich auf jedem Server" neben dem eigentlichen Backup eine rudimentäre Datensicherung, die mir ein paar Konfigurationsverzeichnisse und die MariaDB-Datenbanken wegspeichert.

Hier, so sieht das z.B. auf meinem Icinga2-Testsystem aus:

Code: Alles auswählen

#!/bin/sh

before=$(date +%s)

BU_BASE=/root/scripte
BU_ZIEL=/root/tagessicherung

ERGEBNIS="Keine besonderen Vorkommnisse:"

cd $BU_BASE
cat $BU_BASE/backup_opener.txt > $BU_BASE/backup.txt

echo "Sichere /etc/" >> $BU_BASE/backup.txt
echo "Siehe $BU_BASE/etc.txt" >> $BU_BASE/backup.txt
echo "" >> $BU_BASE/backup.txt
cp -a --strip-trailing-slashes --parents -v /etc/ $BU_ZIEL 2>&1 > $BU_BASE/etc.txt
if [ "$?" -ne "0" ]; then
        ERGEBNIS="Problem bei Sicherung:"
fi

echo "Sichere /var/lib/icinga2/" >> $BU_BASE/backup.txt
echo "Siehe $BU_BASE/var-lib-icinga2.txt" >> $BU_BASE/backup.txt
echo "" >> $BU_BASE/backup.txt
cp -a --strip-trailing-slashes --parents -v /var/lib/icinga2/ $BU_ZIEL 2>&1 > $BU_BASE/var-lib-icinga2.txt
if [ "$?" -ne "0" ]; then
        ERGEBNIS="Problem bei Sicherung:"
fi

echo "Erstelle ein dump der Maria-DB icinga2" >> $BU_BASE/backup.txt
mysqldump --opt -umariadb -geheim icinga2 > $BU_ZIEL/icinga2.sql
if [ "$?" -ne "0" ]; then
        ERGEBNIS="Problem bei Sicherung:"
fi
ls -h $BU_ZIEL/icinga2.sql -al >> $BU_BASE/backup.txt
echo "" >> $BU_BASE/backup.txt

echo "Erstelle ein dump der Maria-DB icingaweb2" >> $BU_BASE/backup.txt
mysqldump --opt -umariadb -geheim icingaweb2 > $BU_ZIEL/icingaweb2.sql
if [ "$?" -ne "0" ]; then
        ERGEBNIS="Problem bei Sicherung:"
fi
ls -h $BU_ZIEL/icingaweb2.sql -al >> $BU_BASE/backup.txt
echo "" >> $BU_BASE/backup.txt

after=$(date +%s)
echo "Gesamtlaufzeit der Datensicherung: $((after - $before)) Sekunden. Geil fix, oder? :-)" >> $BU_BASE/backup.txt

cat $BU_BASE/backup.txt | mail -a"Reply-To: anmich@e-mail.xxx" -s"$ERGEBNIS Tagessicherung icinga2-Server" anmich@e-mail.xxx
Sicherlich ist das extrem umständlich. Es ist halt eine "gewachsene" Geschichte die in erster Linie *meiner* Intuition folgt :-) Die Datei backup.txt enthält nur einen Einleitungstext mit recovery-Anweisungen.

Heute ist mir aufgefallen, dass sich bei Kopierfehlern der Betreff von der E-Mail nicht ändert wenn es Probleme gibt. Wenn das cp (oder das mysqldump) fehlschlägt, beginnt der Betreff der E-Mail nach wie vor mit ""Keine besonderen Vorkommnisse:" (man merkt: Ich war mal 12 Monate bei der Bundeswehr).

Warum ist das so? Setze ich den Errorlevel "irgendwie" mit der Umleitung der Ausgabe zurück? Oder kann ich das Ergebnis von cp bzw. mysqldump gar nicht über $? abfragen?

Gruß,
Jörg

rendegast
Beiträge: 15041
Registriert: 27.02.2006 16:50:33
Lizenz eigener Beiträge: MIT Lizenz

Re: Errorlevelauswertung im Backupscript läuft noch nicht ganz "rund"

Beitrag von rendegast » 06.02.2018 16:33:27

Vermutlich wird $ERGEBNIS nicht aus der Subshell an die Hauptshell weitergegeben.

Ich umgehe sowas pragmatisch derart

Code: Alles auswählen

TMPfile=$(tempfile)

.....; 
     subshell; echo -n PROBLEM >> $TMPfile
.....

ERGEBNIS="$(cat $TMPfile)"; rm $TMPfile

..... | mail -s "$ERGEBNIS ..." ...
mfg rendegast
-----------------------
Viel Eifer, viel Irrtum; weniger Eifer, weniger Irrtum; kein Eifer, kein Irrtum.
(Lin Yutang "Moment in Peking")

tobo
Beiträge: 1964
Registriert: 10.12.2008 10:51:41

Re: Errorlevelauswertung im Backupscript läuft noch nicht ganz "rund"

Beitrag von tobo » 06.02.2018 17:22:37

Was die Fehlerumleitungen angeht, solltest du das genau andersherum zuweisen. Z.B. bei:

Code: Alles auswählen

cp -a --strip-trailing-slashes --parents -v /etc/ $BU_ZIEL 2>&1 > $BU_BASE/etc.txt
//wird zu:
cp -a --strip-trailing-slashes --parents -v /etc/ $BU_ZIEL >$BU_BASE/etc.txt 2>&1
In deiner Variante zeigt Fehlerausgabe (stderr) auf die Standardausgabe (stdout). Danach wird stdout verändert - stderr zeigt aber noch immer auf das, was vorher stdout war. Du musst also zuerst stdout zuweisen und dann stderr auf stdout umbiegen.

altmetaller
Beiträge: 108
Registriert: 03.02.2017 12:28:41

Re: Errorlevelauswertung im Backupscript läuft noch nicht ganz "rund"

Beitrag von altmetaller » 06.02.2018 17:29:24

Hallo,
rendegast hat geschrieben: ↑ zum Beitrag ↑
06.02.2018 16:33:27
Vermutlich wird $ERGEBNIS nicht aus der Subshell an die Hauptshell weitergegeben.
japp, das mag sein.

Ich hätte aber tatsächlich gerne einen kurzen, knackigen Hinweistext in $ERGEBNIS, da der Betreff erfahrungsgemäß das Einzige ist, was meine Kollegen von ihren E-Mails lesen. D.h., wenn ein Problem auftritt, sollte das bereits auf dem ersten Blick beim Überfliegen der linken zwei Zentimeter aller Betreffzeilen erkennbar sein :-)

Zuviel Text desensibilisiert an der Stelle :-)

Gruß,
Jörg

altmetaller
Beiträge: 108
Registriert: 03.02.2017 12:28:41

Re: Errorlevelauswertung im Backupscript läuft noch nicht ganz "rund"

Beitrag von altmetaller » 06.02.2018 17:30:01

Hallo,
tobo hat geschrieben: ↑ zum Beitrag ↑
06.02.2018 17:22:37
In deiner Variante zeigt Fehlerausgabe (stderr) auf die Standardausgabe (stdout). Danach wird stdout verändert - stderr zeigt aber noch immer auf das, was vorher stdout war. Du musst also zuerst stdout zuweisen und dann stderr auf stdout umbiegen.
Da hast Du natürlich Recht. Aber auf mein Problem hat das keine Auswirkungen, oder?

Gruß,
Jörg

tobo
Beiträge: 1964
Registriert: 10.12.2008 10:51:41

Re: Errorlevelauswertung im Backupscript läuft noch nicht ganz "rund"

Beitrag von tobo » 06.02.2018 17:40:49

altmetaller hat geschrieben: ↑ zum Beitrag ↑
06.02.2018 17:30:01
Aber auf mein Problem hat das keine Auswirkungen, oder?
Ist die erste Zeile von $BU_BASE/backup.txt nicht konstant immer die erste Zeile von $BU_BASE/backup_opener.txt? Wenn ich das richtig sehe, dann also nein!?

EDIT: Quatsch - es geht ja um den Betreff!? Wait...
EDIT2:.Keine Ahnung, ich komme nicht drauf. In meinen Augen sollte das so (mit dem Betreff) auch funktionieren.

breakthewall
Beiträge: 507
Registriert: 30.12.2016 23:48:51

Re: Errorlevelauswertung im Backupscript läuft noch nicht ganz "rund"

Beitrag von breakthewall » 06.02.2018 18:50:17

altmetaller hat geschrieben: ↑ zum Beitrag ↑
06.02.2018 15:41:24
Sicherlich ist das extrem umständlich.
Optimistisch ausgedrückt. :wink:

Schon beim ersten begutachten wurde ersichtlich, dass gut die Hälfte an Code einsparen könntest, mit einer effizienten Umsetzung. Leider fehlen auch Sicherheitsprüfungen, damit das Shellscript stets sicher ausgeführt wird. Würde dir empfehlen das nochmal zu überarbeiten, und ggf. auch mal shellcheck zu Hilfe zu nehmen, was durchaus nützlich sein kann. :wink:

scientific
Beiträge: 3020
Registriert: 03.11.2009 13:45:23
Lizenz eigener Beiträge: Artistic Lizenz
Kontaktdaten:

Re: Errorlevelauswertung im Backupscript läuft noch nicht ganz "rund"

Beitrag von scientific » 06.02.2018 21:08:05

Statt dem if-Block wo ERGEBNIS gesetzt wird, gings kürzer mit:

Code: Alles auswählen

[ $? - gt 0 ] && ERGEBNIS="Problem bei Sicherung"
dann putze ich hier mal nur...

Eine Auswahl meiner Skripte und systemd-units.
https://github.com/xundeenergie

auch als Debian-Repo für Testing einbindbar:
deb http://debian.xundeenergie.at/xundeenergie testing main

altmetaller
Beiträge: 108
Registriert: 03.02.2017 12:28:41

Re: Errorlevelauswertung im Backupscript läuft noch nicht ganz "rund"

Beitrag von altmetaller » 07.02.2018 12:08:22

Hallo,
breakthewall hat geschrieben: ↑ zum Beitrag ↑
06.02.2018 18:50:17
Schon beim ersten begutachten wurde ersichtlich, dass gut die Hälfte an Code einsparen könntest, mit einer effizienten Umsetzung.
Ja, da können wir auch gerne drüber schnacken solange wir nicht allzu sehr vom Problem "abdriften" :-)

Ich stelle jetzt mal aus ehrlichem Interesse die Frage, welche Vorteile ich durch eine Reduzierung des Codes habe? Ein Vorteil ist für mich persönlich, dass es nachvollziehbar ist. Ich habe nur gelegentlich mit Linux zu tun und bin daher bemüht, derartige Dinge so zu gestalten, dass ich in 2 Jahren draufschauen kann und mich sofort wieder "intuitiv" zurechtfinde.

Die Sache mit den fehlenden "Sicherheitschecks" würde mich interessieren. Was meinst Du genau?

Gruß,
Jörg

breakthewall
Beiträge: 507
Registriert: 30.12.2016 23:48:51

Re: Errorlevelauswertung im Backupscript läuft noch nicht ganz "rund"

Beitrag von breakthewall » 07.02.2018 13:52:24

altmetaller hat geschrieben: ↑ zum Beitrag ↑
07.02.2018 12:08:22
Ich stelle jetzt mal aus ehrlichem Interesse die Frage, welche Vorteile ich durch eine Reduzierung des Codes habe?
Zuallererst erreichst damit eine Ersparnis von Platz, was wiederum Übersichtlichkeit schafft. Und über eine effizientere Programmierung, bringt man ebenso mehr Struktur in den Code, was die Lesbarkeit enorm verbessert, und auch viele Dopplungen im Code vermeidet. Mal angenommen man hat im Code viele gleiche oder auch minimal abweichende Codezeilen, und ist nun darauf angewiesen diese zu editieren, dann darf man den ganzen Code durchgehen, da vielfach dasselbe steht. Wird dieser Code nun in Variablen und Funktionen ausgelagert, um einfach wiederverwendet werden zu können, dann muss dieser Code nur noch an einer Stelle geändert werden, und nicht mehr endlos oft überall im Shellscript. Das spart natürlich auch Zeit und verringert den Aufwand.
altmetaller hat geschrieben: ↑ zum Beitrag ↑
07.02.2018 12:08:22
Die Sache mit den fehlenden "Sicherheitschecks" würde mich interessieren. Was meinst Du genau?
Damit war gemeint, dass dein Shellscript nur darauf ausgelegt ist, alles nacheinander auszuführen. Doch was passiert wenn eine der Codezeilen aus irgendeinem Grund versagt? Dann ist die Funktion des ganzen Shellscriptes mitunter komplett gestört. Und Code der unbeabsichtigten Umständen ausgesetzt ist, produziert mitunter auch massive Fehler oder gar sehr ernste Probleme. Daher macht es Sinn hier Sicherheitschecks einzubauen, die wichtige Bedingungen überprüfen um die generelle Funktionalität sicherzustellen. Um mal ein simples Beispiel anzuführen, sollte es nicht möglich sein, dass irgendwelche Zeichen an ein Programm übergeben werden, wenn das betreffende Programm explizit auf Zahlenwerte wartet, und nur diese verarbeiten kann. Das führt zwangsläufig zu Fehlern, die man mit Sicherheitschecks verhindern könnte, und den Programmablauf insgesamt stabiler und sicherer machen. Je nach Fall kann es auch schonmal notwendig sein, etwas mehrfach zu prüfen bzw. in periodischen Abständen. Soetwas müsste dann in Schleifen abgearbeitet werden, die den Programmablauf erst weiterführen wenn die Bedingungen stimmen. Wird nun alles simpel nacheinander abgearbeitet, dann besteht hier keine Möglichkeit einen Schritt ggf. nochmal wiederholen zu können. In der Manpage der Bash wird vieles davon erläutert. Und auch das Programm shellcheck kann gute Tipps geben, und auch Vorschläge für Verbesserungen machen. Einfach mal ausprobieren.

Antworten