Schrift
[thread]12218[/thread]

Noch eine Frage zu CGI und Prozessen

Leser: 3


<< |< 1 2 >| >> 18 Einträge, 2 Seiten
tecker
 2008-07-21 18:25
#112399 #112399
User since
2008-02-26
77 Artikel
BenutzerIn
[Homepage] [default_avatar]
Wie kann ich den Prozess eines Skriptes beenden, wenn der Benutzer im Browser den Abbrechen Button betätigt? Das Skript weis ja nichts davon, läuft also weiter.

Man doch irgendwie über Signals den Abbruch im Browser überprüfen oder? Hatte nach sowas keine konkrete Lösung gefunden.
moritz
 2008-07-21 18:43
#112402 #112402
User since
2007-05-11
923 Artikel
HausmeisterIn
[Homepage]
user image
Die gleiche Frage wurde rein zufällig heute Mittag schon in de.comp.lang.perl.misc gefragt - vielleicht hilft dir ja die dortige Antwort weiter.
tecker
 2008-07-21 19:07
#112404 #112404
User since
2008-02-26
77 Artikel
BenutzerIn
[Homepage] [default_avatar]
Ah ok,

würde das dann so aussehen: ?

Code: (dl )
1
2
3
4
5
$SIG{PIPE} = \&close;

sub close{
die "$0: closed\n";
}


Wobei das mit SIGPIPE ja ein Tip deienrseits gewesen ist. Müsste ich mal testen ob es funktioniert (vorrausgesetz man es so wie obenstehend machen).

VG
tecker
 2008-07-31 13:13
#112930 #112930
User since
2008-02-26
77 Artikel
BenutzerIn
[Homepage] [default_avatar]
Um nochmal auf das Problem mit dem Bowser-Abbruch zu kommen ...

Ich habe jetzt folgendes versucht:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
if ($SIG{PIPE}==1)

{
$dbh->disconnect();
foreach my $jpeg_file (glob("/usr/local/apache2/htdocs/images/graphs/*.jpeg")) { unlink("$jpeg_file") }
foreach my $csv_file (glob("/usr/local/apache2/cgi-bin/output/*.csv")) { unlink("$csv_file") }
foreach my $zip_file (glob("/usr/local/apache2/cgi-bin/output/*.zip")) { unlink("$zip_file") }
exit(0);


}


Das Skript bricht soweit ab (nach ein paar Sekunden) nachdem im Browser auf Abbruch geklickt wurde. Allerdings würde ich in dem Fall auch gerne etwas aufräumen und ein paar temporäre Files entfernen. Die Syntax stimmt ansich, da ich das gleiche auch zum Ende des regulären Skriptes mache, was hier ja nun nicht erreicht wird. Scheinbar verträgt es sich aber nicht innerhalb dieser Schleife.

Kann man es den überhaupt so machen? Die Art und Weise wie man es mit einem Handler macht ist mir nicht so ganz geläufig (Link vom Moritz)


Viele Grüße
renee
 2008-07-31 13:51
#112932 #112932
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Bekommst Du eine Fehlermeldung?
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/
tecker
 2008-07-31 14:12
#112934 #112934
User since
2008-02-26
77 Artikel
BenutzerIn
[Homepage] [default_avatar]
Lediglich im Apache-Error-Log ein "...Argument "IGNORE" isn't numeric in numeric eq (==) at..."

Vielleicht weil SIGPIPE default auf 'IGNORE' steht und ich einen numerischen Verlgeich auf ==1 mache?

Aber scheinbar wird innerhalb dieser Schleife nichts ausgeführt. Vermutlich ist es doch falsch auf ein $SIG{PIPE}==1 zu triggern. Dazu müsste man nur wissen welcher Wert bei einer Broken-Pipe abzufragen wäre :)
nepos
 2008-07-31 14:38
#112936 #112936
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
Uhm, hast du dir mal durchgelesen, wie das Signal-Handling unter Perl funktioniert?
Dieser Hash ist keine Liste von Flags für die einzelnen Signale!
Wenn du auf SIGPIPE reagieren willst, dann musst du dafür einen Handler einstellen.
Lies dir den Abschnitt über Signale in perlipc mal bitte durch!
tecker
 2008-07-31 16:20
#112942 #112942
User since
2008-02-26
77 Artikel
BenutzerIn
[Homepage] [default_avatar]
Vielleicht stell ich mich auch nur dumm an.

Habe es jetzt laut Perldoc (sofern ich das richtig verstanden habe) so versucht:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$SIG{PIPE} = \&broken_pipe;
[...]
sub broken_pipe {

#open(LOG, ">>log/Error.log") or die "Cant open Log $! \n"; print LOG " BROKEN!!!! \n"; close (LOG);
die "Broken ... \n";

#$dbh->disconnect();
#open(LOG, ">>log/Error.log"); print LOG "Broken \n"; close(LOG);
#foreach my $jpeg_file (glob("/usr/local/apache2/htdocs/images/graphs/*.jpeg")) { unlink("$jpeg_file") }
#foreach my $csv_file (glob("/usr/local/apache2/cgi-bin/output/*.csv")) { unlink("$csv_file") }
#foreach my $zip_file (glob("/usr/local/apache2/cgi-bin/output/*.zip")) { unlink("$zip_file") }
#exit(0);

}



$SIG{PIPE} = \&broken_pipe; habe ich innerhalb einer Schleife platziert die ständig durchlaufen wird.

Würde es funktionieren, dann würde ja die "die" Meldung im Apache-Log erscheinen, was sie nicht tut. Dort steht lediglich das Execution of ....script.pl .... aborted ist.

Any ideas? :)
MatthiasW
 2008-07-31 17:32
#112949 #112949
User since
2008-01-27
367 Artikel
BenutzerIn
[default_avatar]
Diesen Code musst du nur einmal im Skript ausführen.
Dann wird, bei einem PIPE-Signal die Subroutine broken_pipe() aufgerufen.

Jetzt wäre noch interessant zu wissen, wie/wo du das Signal an dein Skript sendest.

MfG

edit: s/aufrufen/ausführen/
perl -E'*==*",s;;%ENV=~m,..$,,$&+42;e,$==f;$"++for+ab..an;@"=qw,u t,,print+chr;sub f{split}say"@{=} me"'
tecker
 2008-08-01 12:34
#112971 #112971
User since
2008-02-26
77 Artikel
BenutzerIn
[Homepage] [default_avatar]
ok da ich nihn nur einmal im skript ausführen muss habe ich ihn relativ am anfang platziert, nach der initialiserung meiner variablen. letzten endes ist es doch nur eine referenz auf eine sub-routine, welche greift sowie das Pipe-Signal auftritt, oder? aber scheinbar führt er die sub-routine nie aus. ich sehe auch nirgends fehler oder der gleichen, wenn ich im browser während der ausführung des skriptes auf stop klicke. außer die aborted-meldung im apache-log.
<< |< 1 2 >| >> 18 Einträge, 2 Seiten



View all threads created 2008-07-21 18:25.