Thread alarm __WARN__ und __DIE__
(8 answers)
Opened by bianca at 2010-03-04 20:12
Guten Abend!
Bin gerade dabei, ein als CRON laufendes Script so zu erweitern, dass ich Warnungen und Fehler einfach mit in das Apache error.log schreibe. Habe dazu Fragen an Euch: 1. Warum klassifiziert Perl ein "Terminating on signal SIGALRM(14)" als __WARN__ obwohl es stirbt? Ich hätte es bei __DIE__ erwartet, so wie "Illegal division by zero" auch? 2. Ist die nachfolgende Technik korrekt, wie ich das mache? Das if (1==2) benutze ich jeweils immer nur, um für die Tests jetzt die jeweiligen Fehler an und aus zu schalten. Danke Euch 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 #!/usr/bin/perl -w use strict; use diagnostics; use warnings; use Fcntl qw (:DEFAULT :flock); my %env = ('server_errorlog' => 'testerror.log',); if ($^O =~ /mswin/i) { $env{chmod_dateien} = 0666; } else { $env{chmod_dateien} = 0600; } ############################################################################### local $SIG{__WARN__} = sub { (my $error = shift) =~ s/[\r\n]//g; &errorlog_eintrag ($error,4); }; local $SIG{__DIE__} = sub { (my $error = shift) =~ s/[\r\n]//g; &errorlog_eintrag ($error,7); close (STDERR); }; # Hier Programm, dass Fehler macht my $a; my $b = $a + 3; # __WARN__ "Use of uninitialized value $a in addition (+) at sig.pl line ..." print "Bin noch da in " . __LINE__ . "\n"; if (1==2) { alarm (2); while (1==1) {} # __DIE__ "Terminating on signal SIGALRM(14)" } print "Bin noch da in " . __LINE__ . "\n"; if (1==1) { $a = 7/0; # __DIE__ "Illegal division by zero at sig.pl line ..." } print "Bin noch da in " . __LINE__ . "\n"; ############################################################################### sub errorlog_eintrag { my $meldung = shift; my $level = shift; my %apache_loglevel = ( 1 => 'debug', 2 => 'info', 3 => 'notice', 4 => 'warn', 5 => 'error', 6 => 'crit', 7 => 'alert', 8 => 'emerg', ); if (sysopen (my $errorlog,$env{server_errorlog},O_WRONLY|O_APPEND|O_CREAT,$env{chmod_dateien})) { print $errorlog '[' . localtime () . '] [' . $apache_loglevel{$level} .'] [client ' . (defined $ENV{'REMOTE_ADDR'} ? $ENV{'REMOTE_ADDR'} : 'localhost') . '] ' . $meldung . "\n"; close $errorlog; } } EDIT: Code schmaler gemacht wg. Anzeigebug IE/Forum Last edited: 2010-03-05 09:00:50 +0100 (CET) 10 print "Hallo"
20 goto 10 |