lftp: Ausgabe in Datei umleiten

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
tdc
Beiträge: 149
Registriert: 02.10.2002 16:12:37
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Im schweizerischen Rheintal
Kontaktdaten:

lftp: Ausgabe in Datei umleiten

Beitrag von tdc » 05.10.2010 08:28:36

Hallo zusammen

Ich bastle zur Zeit gerade an einem Shell-Skript in dem ich unter anderem lftp verwende. In dem Skript werden verschiedene Ausgaben in eine Log-Datei geschrieben ($LOGFILE). Funktioniert alles soweit, nur schaffe ich es nicht die Ausgaben von lftp in die Log-Datei umzuleiten. Ich habe dazu folgende zwei Varianten ausprobiert:

1)

Code: Alles auswählen

(
lftp $FTPSRV << END_SCRIPT
user $USER $PASSWD
cd $REMOTEDIR
mkdir $DATE
cd $DATE
lcd $LOCALDIR
mput *.tar.bz2
cd ../
$DELCMD
quit
END_SCRIPT
) 2>&1 >> $LOGFILE
2)

Code: Alles auswählen

lftp $FTPSRV 2>&1 >> $LOGFILE << END_SCRIPT
user $USER $PASSWD
cd $REMOTEDIR
mkdir $DATE
cd $DATE
lcd $LOCALDIR
mput *.tar.bz2
cd ../
$DELCMD
quit
END_SCRIPT
Bei beiden Varianten wird der Skript fehlerfrei ausgeführt nur erscheinen die Ausgaben/Fehler auf der Konsole und werden nicht in die angegebene Datei geschrieben. Sieht jemand von euch den Fehler? Ich komme einfach nicht drauf wo das Problem liegt.

Danke und einen schönen Tag
Martin

dimi
Beiträge: 84
Registriert: 19.07.2006 14:09:55

Re: lftp: Ausgabe in Datei umleiten

Beitrag von dimi » 05.10.2010 10:47:38

Ich konnte Dein Problem nicht reproduzieren.

Code: Alles auswählen

(
lftp ftp://ftp.kernel.org/pub/ << END
ls
quit
END
) 2>&1 >> test.log
Schreibt wie gewollt nach test.log.
Es liegt also nicht an der Syntax die Du für Here Document und Redirect verwendest.
Den Fehler seh ich jetzt aber auch nicht.

Benutzeravatar
tdc
Beiträge: 149
Registriert: 02.10.2002 16:12:37
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Im schweizerischen Rheintal
Kontaktdaten:

Re: lftp: Ausgabe in Datei umleiten

Beitrag von tdc » 05.10.2010 11:38:30

Hab den Fehler dank deines Hinweises gefunden. Bei mir wurden Ausgaben auf stdout wie z.B. bei ls ebenfalls umgeleitet. Was jedoch nicht umgeleitet wurde waren die Ausgaben auf stderr. Der Fehler liegt beim Umbiegen der file descriptors:

Code: Alles auswählen

(...) 2>&1 >> $LOGFILE
Dabei wird, wenn ich das nun richtig verstanden habe, stderr auf stdout umgebogen und dieser auf $LOGFILE. Was ich jedoch möchte ist, dass beide nach $LOGFILE zeigen.

Die Lösung für das Problem:

Code: Alles auswählen

(
lftp $FTPSRV << END_SCRIPT
...
END_SCRIPT
)  >> $LOGFILE 2>> $LOGFILE
Nur einen kleinen Schönheitsfehler habe ich noch nicht rausbekommen: Alle Ausgaben innerhalb der Klammern werden auf einer Zeile ausgegeben. Kennt jemand dafür eine Lösung?

Danke und Gruss
Martin

dimi
Beiträge: 84
Registriert: 19.07.2006 14:09:55

Re: lftp: Ausgabe in Datei umleiten

Beitrag von dimi » 05.10.2010 12:01:25

Der Fehler liegt beim Umbiegen der file descriptors:

Code: Alles auswählen

(...) 2>&1 >> $LOGFILE
Dabei wird, wenn ich das nun richtig verstanden habe, stderr auf stdout umgebogen und dieser auf $LOGFILE. Was ich jedoch möchte ist, dass beide nach $LOGFILE zeigen.
Das erreicht man auch so wie Du eigentlich vorhattest, aber die Reihenfolge ist entscheidend. Da habe ich nicht richtig aufgepasst.

Wenn man STDERR auf STDOUT nachdem STDOUT umgeleitet wurde kommt auch beides an der gleichen Stelle an.

Code: Alles auswählen

(...) >> $LOGFILE 2>&1
Zumindest das Minimal Beispiel von oben schreibt zeilenweise in die Ausgabedatei. Vielleicht hilft Dir das ja wieder :)

Benutzeravatar
tdc
Beiträge: 149
Registriert: 02.10.2002 16:12:37
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Im schweizerischen Rheintal
Kontaktdaten:

Re: lftp: Ausgabe in Datei umleiten

Beitrag von tdc » 05.10.2010 12:59:32

Alles klar, macht Sinn und funktioniert auch prima! ;-)

Das mit den Zeilenumbrüchen ist komisch, bei ls funktionierts problemlos (jede Datei steht brav auf einer eigenen Zeile), verwende ich jedoch z.B. zwei echo hintereinander erscheint die Ausgabe nicht auf zwei Zeilen, sondern nur durch ein Leerzeichen getrennt. Das selbe gilt bei Ausgaben auf stderr.

Beispiel:

Code: Alles auswählen

(
lftp $FTPSRV << END_SCRIPT
user $USER $PASSWD
echo "Changing remote directory to $REMOTEDIR"
cd $REMOTEDIR
echo "Creating new directory for today: $DATE"
mkdir $DATE
echo "Entering new directory"
cd $DATE
END_SCRIPT
)  >> $LOGFILE 2>&1
Erzeugt folgende Ausgabe (softern der zu erstellende Ordner bereits existiert):
Changing remote directory to backup/inf-server2 Creating new directory for today: 2010-10-05
mkdir: Access failed: 550 Can't create directory: File exists (2010-10-05) Entering new directory

Wobei die Ausgabe eigentlich so aussehen müsste:
Changing remote directory to backup/inf-server2
Creating new directory for today: 2010-10-05
mkdir: Access failed: 550 Can't create directory: File exists (2010-10-05)
Entering new directory

Irgendwelche Ideen?

Danke und Gruss
Martin

dimi
Beiträge: 84
Registriert: 19.07.2006 14:09:55

Re: lftp: Ausgabe in Datei umleiten

Beitrag von dimi » 08.10.2010 09:07:13

Hast Du schon raus bekommen warum einige Zeilen nicht getrennt ausgegeben werden?

Benutzeravatar
tdc
Beiträge: 149
Registriert: 02.10.2002 16:12:37
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Im schweizerischen Rheintal
Kontaktdaten:

Re: lftp: Ausgabe in Datei umleiten

Beitrag von tdc » 11.10.2010 15:33:45

Hallo dimi

Nein, geht immer noch nicht. So wie es aussieht, liegt das Problem bei lftp. Das echo-Command fügt nicht automatisch einen Zeilenumbruch an. Die einzige Option zu echo ist "-n", welche genau diesen automatischen Zeilenumbruch verhindern soll. Der einzige Unterschied ist jedoch, dass ohne "-n" ein Leerzeichen anstelle des Zeilenumbruches erscheint, mit "-n" überhaupt nichts. :?

Freundliche Grüsse
Martin

Antworten