Thread Aufruf durch eval und alarm schützen: ... aber wie ... (18 answers)
Opened by Andreas_broti at 2005-09-29 09:37

Andreas_broti
 2005-09-29 09:37
#58446 #58446
User since
2005-02-15
14 Artikel
BenutzerIn
[default_avatar]
Guten Morgen zusammen,
ich habe folgendes Problem:

Mein Vorgänger hat eine Überwachung programmiert, die sich automatisch auf eine HTTP-Seite einloggt und die Rückgabe auswertet. Nun habe ich aber das Problem, dass der Webserver auch weg sein kann. Für diesen Fall hat er den eigentlichen Abruf in ein 'eval' gesteckt und mit 'alarm' abgesichert.

Allerdings hängt sich das Programm an dieser Stelle immer auf.
Kann mir da jemand einen Tipp geben, wie ich das eleganter oder besser gesagt richtig machen kann ?

Code: (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
 #
# Request/Response-Zyklus mit umrahmendem Timeout und erster
# Auswertung:
sub tu_https
{
 my ($site, $port, $req, $timeout ) = @_;
 my ($response, $headers, $page, $errs, $http);

     # HTTP - Rohdaten:
 $timeout = 6 if ! defined $timeout;

  # eigentliche Anfrage - geschutzt durch ALARM
 eval
 {
   local $SIG{ALRM} = sub { warn "sslcat $site:$port timeout"; $errs = 1; };
   alarm($timeout);

    # $http: enthalt die komplette Antwort. Zeilen enden in CRLF
    # $errs: enthalt Fehlermeldung; Leerstring fur: OK.

   ($http, $errs) = sslcat($site, $port, $req);
   alarm(0);
 };

  #
  # falls eval schief ging:
 if ( $@ )
 { $errs = "$0: $$: sslcat failed. $@ $timeout Secs.\n";
   print STDERR "EVAL FEHLER '$@' $timeout Secs !!!!\n";
 }

  # print STDERR "******** Zurueck! :\nHTTP='$http'\nERRS='$errs'\n";

  #
  # den Fehlerfall fuhren wir auf eine Response zuruck:
  #
 if ( $errs )
 { $http = "HTTP/1.0 900 NET OR SSL ERROR\r\n\r\n$errs";
 }
 elsif ( "$http" eq ""  ) # xyundef warum ? noch analysieren
 { $http = "HTTP/1.0 901 EMPTY ANSWER\r\n\r\nHTTP='$http'\r\n";
 }
 elsif ( $http !~ /^http/i ) # xyundef warum ? noch analysieren
 { $http = "HTTP/1.0 902 SCHROTT ANSWER\r\n\r\nHTTP='$http'\r\n";
   print STDERR "MUELLMUELL: '$http'\n";
 }

 return ( $http );
}


Grüße,
Andy

View full thread Aufruf durch eval und alarm schützen: ... aber wie ...