While Schleife endet vor Ablauf

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
tobiasd
Beiträge: 95
Registriert: 03.02.2011 15:23:12
Lizenz eigener Beiträge: GNU General Public License

While Schleife endet vor Ablauf

Beitrag von tobiasd » 27.08.2013 12:35:25

Hallo zusammen,

für das Backup unserers Zimbra Server gibt es ein kleines Export Script. Es erstellt eine Userliste und lässt diese in eine While Schleife laufen (gekürzte Version):

Code: Alles auswählen

while read user; do
        echo "$(/bin/date) extracting ${user}"
        NAME=$(echo ${user} | awk -F@ '{print $1_at_$2}')
        echo NAME ist $NAME >> ${zmmailboxlog} 2>&1
        zmmailbox -z -m ${user} getRestURL '//?fmt=tgz' > ${bkpdest}/data/${NAME}.tgz
        EXITC=$?
        if [ "$EXITC" = "0" ]; then
                echo "$(/bin/date) ${user} successfully exported"  >> ${zmmailboxlog}
        else
                echo "$(/bin/date) exitcode von zmmailbox fuer User ${user} ist ${EXITC}" >> ${zmmailboxlog}
        fi
done < ${userliste}
Nun hab ich aber das Verhalten, das die Schleife endet bevor die Userliste komplett durchgelaufen ist. Es handelt sich nicht immer um den gleichen User und die Exitcode Ausgabe in der If-Abfrage erzeugt keinen Logeintrag. Die Userliste ist fehlerfrei und zeigt keine cryptischen Zeichen / überlängen o.ä. und sieht wie folgt aus:

Code: Alles auswählen

.
.
max@muster.de
sepp@muster.de
fred@muster.de
.
.
bis zu einer Anzahl von 81 Usern. Ausgabe im Logfile:

Code: Alles auswählen

NAME ist sepp
Tue Aug 27 11:35:06 CEST 2013 sepp@muster.desuccessfully exported
und dann hörts einfach auf :( Hat jemand eine Idee?

Colttt
Beiträge: 3012
Registriert: 16.10.2008 23:25:34
Wohnort: Brandenburg
Kontaktdaten:

Re: While Schleife endet vor Ablauf

Beitrag von Colttt » 27.08.2013 12:40:07

hört ist immer an einer bestimmten stelle/user auf? wenn ja dort mal gucken..

gibts ein grund für die while schleife? ich würde bei sowas eher eine for-schleife nutzen
Debian-Nutzer :D

ZABBIX Certified Specialist

tobiasd
Beiträge: 95
Registriert: 03.02.2011 15:23:12
Lizenz eigener Beiträge: GNU General Public License

Re: While Schleife endet vor Ablauf

Beitrag von tobiasd » 27.08.2013 12:52:05

hört ist immer an einer bestimmten stelle/user auf? wenn ja dort mal gucken..
Ne, leider nicht - hat ich als erstes überprüft
gibts ein grund für die while schleife? ich würde bei sowas eher eine for-schleife nutzen
Was spricht gegen die While Schleife?

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

Re: While Schleife endet vor Ablauf

Beitrag von rendegast » 27.08.2013 13:26:35

Ist das Skript mit 'set -e' o.ä. ausgestattet?
Ein Fehler des 'zmmailbox .....' würde dann wohl zu einem Abbruch führen.

'zmmailbox .... [2>&1]' kann mit '-v' oder '-d' angereichert werden,
die Ausgabe per 'tee' in ein Logfile.

Evtl. Probleme mit der User-Liste / deren Format?

Code: Alles auswählen

        echo "$(/bin/date) extracting ${user}"
        NAME=$(echo ${user} | awk -F@ '{print $1_at_$2}')
        echo NAME ist $NAME >> ${zmmailboxlog} 2>&1
-> zBsp.

Code: Alles auswählen

        echo "$(/bin/date) extracting ${user}"
        NAME=$(echo ${user} | awk -F@ '{print $1_at_$2}')
        echo "NAME ist ${NAME}, USER ${user}" >> ${zmmailboxlog} 2>&1
falls (bei dynamischer Erstellung) zBsp. 2 User auf eine Zeile rutschen.
Sortieren? ->

Code: Alles auswählen

fred@muster.de
max@muster.de
sepp@muster.de
uniq?

Code: Alles auswählen

userliste="nichtvorhanden@muster.de
$userliste
"
erzeugt eine "saubere" Fehlermeldung ohne Abbruch?
EDIT, Ups 'done < ${userliste}' liest ja aus einer Datei, nicht aus einer Variablen,
dann entsprechend.





---------------------------------------------------
if [ "$EXITC" = "0" ]; then
würde ich

Code: Alles auswählen

        if [ "x$EXITC" = "x0" ]; then
Zuletzt geändert von rendegast am 27.08.2013 15:25:15, insgesamt 2-mal geändert.
mfg rendegast
-----------------------
Viel Eifer, viel Irrtum; weniger Eifer, weniger Irrtum; kein Eifer, kein Irrtum.
(Lin Yutang "Moment in Peking")

Colttt
Beiträge: 3012
Registriert: 16.10.2008 23:25:34
Wohnort: Brandenburg
Kontaktdaten:

Re: While Schleife endet vor Ablauf

Beitrag von Colttt » 27.08.2013 13:38:02

tobiasd hat geschrieben:Was spricht gegen die While Schleife?
while-schleifen nimmt man dann wenn man nicht weiss wann es passiert, also vorher kein definierten zustand hat, eine for-schleife dann wenn man weiss wieviel es ist und da du ja weisst wieviel user es sind bzw es schon vorher feststeht das es 95User sind, wäre es hier angebrachter, mMn
Debian-Nutzer :D

ZABBIX Certified Specialist

Benutzeravatar
r900
Beiträge: 1053
Registriert: 09.10.2011 20:06:11
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Stockholm

Re: While Schleife endet vor Ablauf

Beitrag von r900 » 27.08.2013 14:41:46

Also auf jeden Fall solltest du Anführungszeichen konsequenter benutzen, z.B. in Zeilen 3 und 4. awk in Zeile 3 z.B. macht so wie du es geschrieben hast bei mir nicht was es soll. Außerdem will man eigentlich so gut wie immer read -r wenn man aus Dateien liest. help read verrät weshalb.

Code: Alles auswählen

while read -r user; do
        echo "$(/bin/date) extracting ${user}"
        NAME=$(echo "${user}" | awk -F@ '{print $1"_at_"$2}')
        echo "NAME ist $NAME" >> ${zmmailboxlog} 2>&1
        zmmailbox -z -m "${user}" getRestURL '//?fmt=tgz' > "${bkpdest}/data/${NAME}.tgz"
        EXITC=$?
        if [ $EXITC -eq 0 ]; then
                echo "$(/bin/date) ${user} successfully exported"  >> ${zmmailboxlog}
        else
                echo "$(/bin/date) exitcode von zmmailbox fuer User ${user} ist ${EXITC}" >> ${zmmailboxlog}
        fi
done < ${userliste}
Könnte es sein dass ein anderer Prozess in die Datei ${userliste} schreibt während das Skript läuft? Wie wird denn ${userliste} erstellt?

Antworten