Thread Problem mit Filehandle. system: windows server 2003 (2 answers)
Opened by michaelf2050 at 2010-05-21 15:49

michaelf2050
 2010-05-21 15:49
#137493 #137493
User since
2009-11-03
19 Artikel
BenutzerIn
[default_avatar]
hallo! ich habe ein Problem mit einem Perlscript
ich führe diese Script aus (hier sind einige Filehandles drinnen - diese sind aber nicht von mir und ich habe versucht diese in den subroutinen extent und blockfiles zu erweitern - es gibt die angeführten Verzeichnisse und ich erhalte vom Modul Sendmail (hat jemand anderer aus der Abteilung geschrieben) ein mail mit den Fehlern (auch in code geschrieben, da einfacher wegzublenden)
Mit diesem Script werden .txt dateien geöffnet und ausgelesen
wenn ich das Script ausführe bekomm ich im Perl die Fehlermeldung:
readline() on closed filehandle main::FILE at d:\admin\perl\scripts\ora_alertparseZR_new.pl line 123.
und:
readline() on closed filehandle main::FILE at d:\admin\perl\scripts\ora_alertparseZR_new.pl line 104.
kann mir jemand helfen, wo bei meinen subs (Blockfiles und extents) der Fehler ist - danke Michael

Fehler der von mir definiert wurde und per mail gesendet wird
Code: (dl )
Datei der Datenbank '.' konnte nicht geöffnet werden(Permission denied) Datei der Datenbank '..' konnte nicht geöffnet werden(Permission denied) Datei der Datenbank 'BA_status.txt' konnte nicht geöffnet werden(No such file or directory) Datei der Datenbank 'BG_status.txt' konnte nicht geöffnet werden(No such file or directory) Datei der Datenbank 'BR_status.txt' konnte nicht geöffnet werden(No such file or directory) Datei der Datenbank 'GR_status.txt' konnte nicht geöffnet werden(No such file or directory) Datei der Datenbank 'IN_status.txt' konnte nicht geöffnet werden(No such file or directory) Datei der Datenbank 'JPBA_status.txt' konnte nicht geöffnet werden(No such file or directory) Datei der Datenbank 'JPBG_status.txt' konnte nicht geöffnet werden(No such file or directory) Datei der Datenbank 'JPBR_status.txt' konnte nicht geöffnet werden(No such file or directory) Datei der Datenbank 'JPGR_status.txt' konnte nicht geöffnet werden(No such file or directory) Datei der Datenbank 'JPIN_status.txt' konnte nicht geöffnet werden(No such file or directory) Datei der Datenbank 'JPKI_status.txt' konnte nicht geöffnet werden(No such file or directory) Datei der Datenbank 'JPKW_status.txt' konnte nicht geöffnet werden(No such file or directory)


hier der Code
Code (perl): (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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
#!/usr/bin/perl

use strict;
use warnings;
require "sendmail.pl";

##
### Definitionen
###

my $maindir = 'F:\\database\\ZR1\\admin\\bdump';
my $SID = 'ZR1'; # BA1 BR1 ZR1 LI1 SA1 VE1 WI1 ZR1 IN1 SE1 GR1 KW1 KI1 JPBA JPBR JPZR JPLI JPSA JPVE JPWI JPZR JPIN JPSE JPGR JPKW JPKI
my $alertlog = "$maindir\\alert_$SID.log";
my $alertlog_backup = $alertlog.'_'.('SO','MO','DI','MI','DO','FR','SA')[(localtime)[6]];
my $mailbodyfile = 'D:\\admin\\perl\\temp\\SENDMAIL_BODYFILEZR1.txt';
my $tracelog_dir = 'F:\\database\\ZR1\\admin\\udump';
my $cdump_dir = 'F:\\database\\ZR1\\admin\\cdump';
my $tracefile_pattern = "^${SID}_.*\\.trc\$";
my $corefile_pattern = "^${SID}_.*\\.trc\$";

my $block_dir = 'd:\\admin\\Tablespace\\block';
#my $block_pattern = ".*_repair.*\\.txt\$";
my $status_dir = 'd:\\admin\\Tablespace\\status';
#my $status_pattern = ".*_status.*\\.txt\$";
my $load_dir = 'd:\\admin\\tablespace\\load';
#my $load_pattern = ".*_load.*\\.txt\$";
my @infos;
my @errors;

###
### Prozeduren
###

sub send_mail {
        my ($subject_ref, $error_ref) = @_;
        ### sendmail.pl braucht den Body als File => erstellen
        open SENDMAILBODY, '>'.$mailbodyfile or die "Sendmail Bodyfile '$mailbodyfile' kann nicht erstellt werden! ($!)";
        print SENDMAILBODY @$error_ref;
        close SENDMAILBODY;
        sendmail($$subject_ref, $mailbodyfile);
        return 0;
}

sub tracelog_unlink {
        if (opendir TRACELOG_DIR, $tracelog_dir) {
                foreach my $file (readdir TRACELOG_DIR) {
                        next unless $file =~ /$tracefile_pattern/;
                        my $mtime = (stat("$tracelog_dir\\$file"))[9];
                        if (time() - $mtime > 7*24*60*60) {
                                unlink "$tracelog_dir\\$file" or push @errors, "Tracelog '$tracelog_dir\\$file' kann nicht gelöscht werden. ($!)";
                        }
                }
                closedir TRACELOG_DIR;
        } else {
                push @errors, "Tracelog-Verzeichnis '$tracelog_dir' kann nicht geöffnet werden. ($!)";
        }
}
sub COREDUMP_unlink {
        if (opendir COREDUMP_DIR, $cdump_dir) {
                foreach my $file (readdir COREDUMP_DIR) {
                        next unless $file =~ /$corefile_pattern/;
                        my $mtime = (stat("$cdump_dir\\$file"))[9];
                        if (time() - $mtime > 7*24*60*60) {
                                unlink "$cdump_dir\\$file" or push @errors, "Tracelog '$cdump_dir\\$file' kann nicht gelöscht werden. ($!)";
                        }
                }
                closedir COREDUMP_DIR;
        } else {
                push @errors, "Tracelog-Verzeichnis '$cdump_dir' kann nicht geöffnet werden. ($!)";
        }
}

sub blockfiles {
        if (opendir BLOCK_DIR, $block_dir) {
                foreach my $file (readdir BLOCK_DIR) {
                        if (open FILE, '<'.$file)  {
                                my $ok = 0; 
                                while (my $file_row = <FILE>) {
                                        if ($file_row =~ /no rows selected/)    {
                                                $ok = 1;
                                                last;
                                        }
                                }
                                if ($ok == 1) {
                                        push @infos, "Keine Fehlerhaften Blocks in Datenbank '$file' ($!)";
                                } else {
                                        push @errors, "Fehlerhafte Blöcke in Datenbank '$file' ($!)";
                                }
                                close FILE;
                        } else {
                                push @errors, "Datei der Datenbank '$file' konnte nicht geöffnet werden($!)\n";
                        }
                }
                closedir BLOCK_DIR;
        } else {
                push @errors, "Verzeichnis $block_dir nicht lesbar ($!)";
        }
}

sub statusfiles {
        if (opendir STATUS_DIR, $status_dir) {
                foreach my $file (readdir STATUS_DIR) {
                        open FILE, '<' .$file or push @errors, "Datei der Datenbank '$file' konnte nicht geöffnet werden($!)\n";
                        while (<FILE>) {
                                if (/OFFLINE/) {
                                        push @errors, "TABLESPACE OFFLINE ($!)\n";
                                } else {
                                        push @errors, "ALLE TABLESPACES ONLINE ($!)\n";
                                }
                        }
                        close FILE;
                }
                closedir STATUS_DIR;
        } else {
                push @errors, "Verzeichnis '$status_dir' nicht lesbar($!)\n";
        }
}

sub extent {
        if (opendir LOAD_DIR, $load_dir) {
                foreach my $file (readdir LOAD_DIR) {
                        open FILE, '<' .$file or push @errors, "File $file konnte nicht geöffnet werden ($!)\n";
                        while (<FILE>) {
                                my ($datafile, $value)= split ';' , $_;
                                if (my $value < "1") {
                                        push @errors, "Es wurden $value extents in $datafile verursacht ($!)\n";
                                } else {
                                        push @errors, "es wurden keine extents verursacht ($!)\n";
                                }
                        }
                        close FILE;
                }
                closedir LOAD_DIR;
        } else {
                push @errors,"Verzeichnis '$load_dir' konnte nicht geöffnet werden ($!)\n";
        }
}       
### Hauptteil
###

open ALERTBACKUP, '>'.$alertlog_backup or die "Alertlog '$alertlog_backup' Backup kann nicht erstellt werden! ($!)";
### Alertlog lesend und schreibend öffnen
if (open LOG, '+<'.$alertlog) {
        while (<LOG>) {
                ### jede Zeile gleich wegsichern
                print ALERTBACKUP $_;
                ### Zeile nach Oracle-Fehler durchsuchen
                if (/ORA-/) {
                        ### wenn ein ORA-Fehler vorkommt, dann ausgeben
                        push @errors, "Logdatei '$alertlog' beinhaltet folgende Oracle-Fehler:\n" unless @errors;
                        push @errors, $_;
                }
        }
        ### Logdatei leeren, wenn keine Oracle-Fehler enthalten sind
        ### (die potenzielle race condition ist bekannt und wird akzeptiert)
        truncate LOG, 0 unless @infos;
        close LOG;
} else {
        push @errors, "Logdatei '$alertlog' konnte nicht gelesen werden! ($!)\n";
}
close ALERTBACKUP;

&tracelog_unlink;
&COREDUMP_unlink;
&statusfiles;
&blockfiles;
&extent;


my $mail_subject; ### sendmail.pl setzt Win32::NodeName() davor!
if (@errors) {
        $mail_subject .= "ZR1_Alertlog_Fehler!!!";
} else {
        $mail_subject .= "ZR1_Alertlog_OK";
}

### Informations E-Mail versenden
&send_mail(\$mail_subject,\@errors);
### Programm mit Status 999 beenden, wenn ein Oracle-Fehler gefunden wurde
exit 999 if @errors;







#my @block_files = ("BA_repair.txt", "BR_repair.txt", "BG_repair.txt", "LI_repair.txt", "SA_repair.txt", "VE_repair.txt", "WI_repair.txt", "IN_repair.txt", "SE_repair.txt", "KI_repair.txt", "JPBA_repair.txt", "JPBG_repair.txt", "JPBR_repair.txt", "JPZR_repair.txt", "JPLI_repair.txt", "JPGR_repair.txt", "JPSA_repair.txt", "JPKI_repair.txt", "JPKW_repair.txt", "JPVE_repair.txt", "JPIN_repair.txt", "JPSE_repair.txt", "JPWI_repair.txt");
#my @status_files = ("BA_status.txt", "BR_status.txt", "BG_status.txt", "LI_status.txt", "SA_status.txt", "VE_status.txt", "WI_status.txt", "IN_status.txt", "SE_status.txt", "KI_status.txt", "JPBA_status.txt", "JPBG_status.txt", "JPBR_status.txt", "JPZR_status.txt", "JPLI_status.txt", "JPGR_status.txt", "JPSA_status.txt", "JPKI_status.txt", "JPKW_status.txt", "JPVE_status.txt", "JPIN_status.txt", "JPSE_status.txt", "JPWI_status.txt");
#my @load_files = ("BA_load.txt", "BR_load.txt", "BG_load.txt", "LI_load.txt", "SA_load.txt", "VE_load.txt", "WI_load.txt", "IN_load.txt", "SE_load.txt", "KI_load.txt", "JPBA_load.txt", "JPBG_load.txt", "JPBR_load.txt", "JPZR_load.txt", "JPLI_load.txt", "JPGR_load.txt", "JPSA_load.txt", "JPKI_load.txt", "JPKW_load.txt", "JPVE_load.txt", "JPIN_load.txt", "JPSE_load.txt", "JPWI_load.txt");


Edit by esskar: perl anstatt code-tags
Last edited: 2010-05-21 15:59:08 +0200 (CEST)

View full thread Problem mit Filehandle. system: windows server 2003