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:
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/) {  
; $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