Thread alarm __WARN__ und __DIE__ (8 answers)
Opened by bianca at 2010-03-04 20:12

bianca
 2010-03-04 20:12
#134055 #134055
User since
2009-09-13
7016 Artikel
BenutzerIn

user image
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

View full thread alarm __WARN__ und __DIE__