Schrift
[thread]7504[/thread]

FTP-Upload: Unexpected EOF / Bad file descriptor: Upload von mehreren Dateien per FTP

Leser: 1


<< |< 1 2 >| >> 16 Einträge, 2 Seiten
crudy
 2005-11-28 19:43
#60496 #60496
User since
2005-11-28
6 Artikel
BenutzerIn
[default_avatar]
Hallo,

mein Skript läuft auf einem Windows-Rechner, holt sich aus einer Oracle-DB Daten, verarbeitet diese und erstellt daraus 5 Textdateien. Danach soll ein FTP-Upload der Dateien auf einen FreeBSD-Server erfolgen. Dazu benutze ich Net::FTP (Debug => 1, Passive => 1).

Nun passiert *scheinbar* zufällig beim Upload der Dateien ein Fehler bei einer oder mehreren der Dateien, wobei ich bei mehreren Durchläufen kein System entdecken konnte, welche der Dateien es trifft.

Die Debugging-Ausgabe ist:
Net::FTP: Unexpected EOF on command channel at C:/Perl/site/lib/Net/FTP/dataconn.pm line 73

Die Ausgabe von $! ist:
Bad file descriptor

Ein perl -cw sagt: Syntax OK


Hier mal mein Code:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
#!c:/perl/bin/perl.exe
use strict;

# Module:
use DBI; # Zugriff auf die Oracle-DB
use DBD::Oracle; # Zugriff auf die Oracle-DB
use Net::FTP; # FTP-Up- & Download fuer Online-Server

# DB-connect Oracle
my $dbh = db_connect_oracle();

if ($dbh) {
print "Oracle-Datenbank-Connect erfolgt\n";
# SQL-Insert aus Oracle-DB bauen fuer Online-DB
read_oradb($dbh);
}

sub db_connect_oracle
{
[...]
}

sub read_oradb
{
my $localdir = "C:/XXX/download/";
my $t_spieler = "spieler";

(my $sql4 = $dbh->prepare(qq{SELECT * FROM $t_spieler})) || print "Database prepare statement not made: $DBI::errstr";
(my $result4 = $sql4->execute()) || print "Database execute not made: $DBI::errstr";
open(DATA_SP, ">".$localdir.'spieler.sql') || print "kann file nicht oeffnen\n";
print DATA_SP "DELETE FROM $t_spieler;\n";
while (my @spieler = $sql4->fetchrow_array) {
for (my $i = 0; $i < 3; $i++) {
# leerzeichen am Anfang und Ende entfernen
chomp($spieler[$i]);
$spieler[$i] =~ s/^\s+//;
$spieler[$i] =~ s/\s+$//;
# zeilenumbrueche aus Feldern entfernen
$spieler[$i] =~ y/\cJ\cM//d;
# leere Werte durch NULL ersetzen
if ($spieler[$i] eq '' || $spieler[$i] eq 'NULL') {
$spieler[$i] = 'NULL';
}
# Falls Zahlen mit Nachkommastellen auftreten, Komma durch Punkt ersetzen
my $muster = '^(\d+)\,(\d+)$';
if ($spieler[$i] =~ /$muster/) { &nbsp
; $spieler[$i] = $1.'.'.$2;
}
}
# schreibe Insert-Zeile in die SQL-Datei
print DATA_SP "INSERT INTO ".$t_spieler." (SPNR, KDNR, BEMERKUNGEN) VALUES (".$spieler[0].",".$spieler[1].",'".$spieler[2]."');\n";
}
$sql4->finish();
close(DATA_SP);
my $check_sp = ftp_transfer("spieler.sql");

# die anderen 4 Dateien spar ich mir jetzt, Code ist
# ungefähr identisch, und o.g. Fehler treten auch fuer
# diese Datei auf.

sub ftp_transfer
{
my $quelle = $_[0];
my $ziel = $quelle;
my $server="XXX.XXX.XXX.XX"; # Servername FTP
my $username="XXX"; # Benutzername auf dem FTP-Server
my $password="XXX"; # Passwort für den Benutzer

my $localdir = "C:/XXX/download/";
my $serverdir_up = "/usr/home/XXX/XXX/upload/";
my $serverdir_down = "/usr/home/XXX/XXX/download/";

my $ftp=Net::FTP->new($server, Debug => 1, Passive => 1) || print "Keine Verbindung mit $server - Fehler: ".$!." \n";
$ftp->login($username, $password) || print "Fehler beim einloggen - Fehler: ".$!." \n";

# Ins lokale Verzeichnis wechseln
chdir($localdir) || print "kann nicht ins Verzeichnis wechseln!\n";

# laedt die SQL-Datei herauf
$ftp->cwd("XXX");
$ftp->cwd("upload");
$ftp->ascii;
$ftp->put($localdir.$quelle, $ziel) || print "Fehler beim upload von ".$localdir.$quelle." auf ". $server." - ".$serverdir_up." - Fehler: ".$!." \n";
$ftp->quit();
if (! $!) {
return "true";
} else {
return "false";
}
}


Meine Files sehen exemplarisch so aus (jeweils zwischen 10 und ca. 120.000 Zeilen pro Datei - jeweils Insert-Statement + Zeilenumbruch):
INSERT INTO foo (ZAHL1, ZAHL2, ZAHL3, ZAHL4, ZAHL5, ZAHL6, ZAHL7, ZAHL8, ZAHL9, ZAHL10, ZAHL11, ZAHL12, ZAHL13, ZAHL14, ZAHL15) VALUES (4,6,21,27,30,31,36,49,0,0,0,0,0,0,0);


Ich komm irgendwie nicht weiter - kann es an irgendwelchen Inkompatibilitäten i. Bez. a. Windows liegen?
Der Witz ist ja auch, dass die Uploads manchmal funktionieren, und dann wieder nicht :-(
Zum Teil werden die Dateien auch hochgeladen, ein less auf die abgebrochene Datei lässt alles normal (s.o.) aussehen.


Jeder Tipp bringt mich weiter, ich hab mich wirklich schon dumm & dusselig gegoogelt mir die Augen aus dem Kopf geguckt, was meinen Code angeht...

Danke & Gruß,
Christiane
sesth
 2005-11-29 00:00
#60497 #60497
User since
2005-02-01
181 Artikel
BenutzerIn
[default_avatar]
Hallo Christiane,

ohne jetzt tiefer einzusteigen, würde ich mal auf binär-Mode umschalten. Du hast ja mit
Code (perl): (dl )
$ftp->ascii;
einen ASCII-Transfer eingestellt. Wenn da ein Sonderzeichen dazwischenkommt, bircht der Transfer ab. Und die Meldung "Unexpected EOF" deutet auf ein Strg-Z in den Dateien hin.
Gruß
Thomas
coax
 2005-11-29 11:09
#60498 #60498
User since
2003-08-11
457 Artikel
BenutzerIn
[default_avatar]
[quote=sesth,28.11.2005, 23:00]Du hast ja mit
Code (perl): (dl )
$ftp->ascii;
einen ASCII-Transfer eingestellt. Wenn da ein Sonderzeichen dazwischenkommt, bircht der Transfer ab.[/quote]
Laut Fehlermeldung reiszt der Command Channel nicht der Data Channel ab.
Scheint also so als tritt der Verbindungs-Timeout auf.
,,Das perlt aber heute wieder...'' -- Dittsche
crudy
 2005-11-29 16:51
#60499 #60499
User since
2005-11-28
6 Artikel
BenutzerIn
[default_avatar]
Danke für Eure Antworten.

Ich bin leider noch nicht weiter gekommen.

Also wenn ich mich richtig erinnere, ist die Net::FTP-Standard-Einstellung "auto" - das $ftp->ascii habe ich in meiner Verzeiflung hinzugefügt ;-), da ich dachte, das sei es vielleicht. Vorher trat es aber auch schon auf.

@coax: Weisst Du mehr über den Command Channel und was mir das i. Bez. a. mein Skript sagen kann? Die FTP-Verbindung zum Server ist i.d.R. sehr stabil, der Fehler tritt sowohl manchmal nach ca. 1 Minute, als auch manchmal nach 20 oder 30 Minuten auf.
Stutzig macht mich halt auch die andere Ausgabe "Unexpected EOF" - oder ist das nur das Resultat der warum-auch-immer abgerissenen Verbindung?
crudy
 2005-11-29 16:54
#60500 #60500
User since
2005-11-28
6 Artikel
BenutzerIn
[default_avatar]
[quote=sesth,28.11.2005, 23:00]Und die Meldung "Unexpected EOF" deutet auf ein Strg-Z in den Dateien hin.[/quote]
ah, da war ich vorhin zu schnell -
was meinst Du mit Strg-Z?
Steh ich auf der Leitung? ???
nepos
 2005-11-29 17:49
#60501 #60501
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
EOF = End Of File, mit STRG+Z kann man sowas eingeben ;)
sesth
 2005-11-29 18:44
#60502 #60502
User since
2005-02-01
181 Artikel
BenutzerIn
[default_avatar]
Hallo Christiane,

ich hatte Dein Posting vor meiner ersten Antwort nur kurz überflogen. Das mit dem Command-Channel hatte ich überlesen. Deshalb denke ich, dass coax recht hat und es nicht an den Daten liegt. Das kannst Du aber recht einfach testen, indem Du mit den gleichen Daten die Transfers wiederholst. Wenn der Fehler dann reproduzierbar an den gleichen Stellen auftritt, sind es vermutlich die Daten - wenn nicht, liegen die Ursachen woanders.
Gruß
Thomas
crudy
 2005-11-29 20:38
#60503 #60503
User since
2005-11-28
6 Artikel
BenutzerIn
[default_avatar]
Vielen Dank für Eure Infos.

@nepos:
ok, wieder was dazu gelernt... Nicht EOF=End of file, das war schon klar, aber Strg-z zum Anhalten war mir in der Tat unbekannt.

Nun, da das Skript auf einem anderen Rechner ausgeführt wird, muss ich dem Mitarbeiter glauben, wenn er beteuert, nix in die Konsole getippt zu haben.
Moment, oder kann es unter Windows zu dem Szenario kommen, dass er z.B. in einem offenen Word- oder Excel-Dokument arbeitet, in welchem er Strg-z für "rückgängig" drückt, es aber Auswirkungen auf das gerade im Hintergrund laufende Perl-Skript hat?? Dürfte doch eigentlich nicht - trotzdem möglich??


@sesth:
nein, das ist es ja gerade, es ist völlig unreproduzierbar und *scheinbar* zufällig.
["Es gibt keine Zufälle!"]
nepos
 2005-11-30 09:55
#60504 #60504
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
Nein, eigentlich gehen auch unter Windows Tastatur-Events nur an das fokussierte Fenster. Ausser man hat da fuer irgendwelche Tray-Programme oder aehnliches was eigenes am Laufen. Aber das ist bei der Konsole sicher nicht der Fall.
renee
 2005-11-30 10:10
#60505 #60505
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Wer weiss, was in dem Feld "Bemerkungen" alles auftritt.

Noch ein Tipp: Benutz besser die $dbh->quote()-Methode wenn Du Dein SQL-String zusammenbaust.
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
<< |< 1 2 >| >> 16 Einträge, 2 Seiten



View all threads created 2005-11-28 19:43.