Schrift
[thread]7313[/thread]

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

Leser: 1


<< |< 1 2 >| >> 19 Einträge, 2 Seiten
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
renee
 2005-09-29 10:35
#58447 #58447
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Arbeitest Du mit dem CPAN:LWP -Paket?? Damit kann man einfach Webseiten abfragen...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Andreas_broti
 2005-09-29 10:38
#58448 #58448
User since
2005-02-15
14 Artikel
BenutzerIn
[default_avatar]
Ja, das verbirgt sich hinter sslcat.
Dies ist eine sub, in der schon eine Auswertung durchgeführt wird.
vayu
 2005-09-29 11:34
#58449 #58449
User since
2005-01-13
782 Artikel
BenutzerIn
[default_avatar]
Code: (dl )
local $SIG{ALRM} = sub { warn "sslcat $site:$port timeout"; $errs = 1; };


ich weiss nicht, aber das $SIG{ALRM} sieht mir irgendwie falsch aus, OHNE davon ahnung zu haben :)
Gast Gast
 2005-09-29 14:47
#58450 #58450
Deswegen sollte man vorher immer nochmal nachsehen, ALRM ist nämlich trotzdem richtig, siehe perldoc perlipc ;)
vayu
 2005-09-29 14:49
#58451 #58451
User since
2005-01-13
782 Artikel
BenutzerIn
[default_avatar]
http://www.online-age.de/forum/images/smilies/redf...*sich in seine ecke verkriecht*\n\n

<!--EDIT|vayu|1127991011-->
Strat
 2005-09-29 17:06
#58452 #58452
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
das problem ist, dass im Handler fuer $SIG{ALRM} nur ein warn() vorkommt und kein die(), das den eval-block beendet, und von daher bis in alle ewigkeit gewartet wird.

wie man sowas macht: siehe perldoc -f alarm (da ist ein schoenes beispiel drinnen)\n\n

<!--EDIT|Strat|1127999224-->
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
kristian
 2005-09-30 12:00
#58453 #58453
User since
2005-04-14
684 Artikel
BenutzerIn
[Homepage] [default_avatar]
Hallo
Ich sehe da oben "\r\n". Funktionieren Signale mitlerweile auf Dosen?
Gruss Kristian

Edit: Sorry, vergesst es, hatte nicht richtig hingesehen und das Script falsch interpretiert...\n\n

<!--EDIT|kristian|1128067372-->
renee
 2005-09-30 12:18
#58454 #58454
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Zitat aus Winfaq5 (ActiveState):
Code: (dl )
1
2
3
Why doesn't signal handling work on Windows?

Signals are unsupported by the Win32 API. The C Runtime provides crude support for signals, but there are serious caveats, such as inability to die() or exit() from a signal handler. Perl itself does not guarantee that signal handlers will not interrupt critical operations such as memory allocation, which means signal invocation may throw perl internals into disarray. For these reasons, signals are unsupported at this time.
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Crian
 2005-09-30 15:23
#58455 #58455
User since
2003-08-04
5870 Artikel
ModeratorIn
[Homepage]
user image
Die Verwendung von "\r\n" im oben gezeigten Skript ist meiner Meinung nach ein Übel. Dies macht nur genau dann Sinn, wenn man unter einem unixoiden System eine Datei für ein Windowssystem erstellen will, die dann binär dorthin übertragen wird.

Lässt man das selbe Programm unter Windows laufen, so enthalten die Zeilenenden/umbrüche die wirklich schöne Folge 0x0d 0x0d 0x0a.

Das selbe passiert, wenn man die erzeugten Dateien noch einmal im Ascii-Modus auf einen Windowsrechner überträgt.

Also Vorsicht.
Einem Browser ist das egal, aber ich würde solchen Unsinn gar nicht erst schreiben. Entweder man schreibt direkt was man meint, per Setzen von $\ oder Verwenden von chr(0x0d) und chr(0x0a), oder man schreibt einfach \n. Ohne \r.

Aber ich habe das Gefühl, ich missioniere in diesem Punkt taube Ohren ;)
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
<< |< 1 2 >| >> 19 Einträge, 2 Seiten



View all threads created 2005-09-29 09:37.