Thread Problem mit Filehandle. system: windows server 2003
(2 answers)
Opened by michaelf2050 at 2010-05-21 15:49
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) |