Leser: 1
|< 1 2 >| | 17 Einträge, 2 Seiten |
amun-ra198+2008-03-01 00:38:00--Danke für die fixe Antwort. Diese Idee hatte ich auch. Dazu müßte ich dann allerdings umfangreichere Veränderungen vornehmen (den Kernprozess auslagern), was ich nach Möglichkeit vermeiden möchte. Ich war der Meinung, dass das doch auch irgendwie einfacher gehen müßte.
Wenn es natürlich keine andere Möglichkeit gibt, werde ich eine Parallelverarbeitung umsetzen.
amun-ra198+2008-03-01 00:38:00--Hat noch jemand eine Idee?
amun-ra198+2008-03-03 20:05:36--[...] Letztlich werde ich den Prozess jetzt wohl doch in einen separaten Prozess auslagern [...] auch wenn ich das bestehende Skript dann leider auseinanderpflücken muss. [...]
murphy+2008-03-04 21:33:12--Wenn Du fork verwendest muss der Code für den zweiten Prozess nicht unbedingt in einem separaten Programm untergebracht werden.
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 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107
#!/usr/bin/perl -w # Skript Name: test1.pl # Parameter: Aktionstyp = Prozess use strict; use warnings; use CGI; use Fcntl qw(:flock); $| = 1; my $cgi = CGI->new; my $url = 'http://server/cgi-bin/test1.pl'; #print "Content-type: text/html \n\n"; #print $cgi->param('Aktionstyp'); # Aufteilen in zwei Subroutinen my $merker = $cgi->param('Aktionstyp') || 'Anzeigen'; if ($merker eq 'Anzeigen') { show($cgi); } elsif ($merker eq 'Prozess') { create($cgi); } # Erstellen des Prozesses und Redirect auf neue Seite sub create { my ($cgi) = @_; my $id = time() . $$; my $filename = "prozess.id$id"; $SIG{CHLD} = 'IGNORE'; if (my $pid = fork) { print $cgi->redirect("$url?Aktionstyp=Anzeigen;id=$id"); # Ende des Parent Prozesses exit; } else { # Beginn Anlegen der Datei open my $fh, ">", $filename; flock $fh, LOCK_EX; close STDOUT; close STDERR; close STDIN; # Erstmal Warten (soll den Prozess simulieren) sleep 10; close $fh; # Ende Anlegen der Datei # Ende des Child Prozesses exit; } } # Anzeigen des Ergebnisses, wenn ChildProzess fertig sub show { my ($cgi) = @_; my $id = $cgi->param('id') || ''; print $cgi->header; print $cgi->start_html; my $filename = "prozess.id$id"; my $meta = $cgi->start_html( my $meta_refresh = -head => $cgi->meta( { -http_equiv => 'refresh', -content => "2; $url?w=show;id=$id", } )); if (open my $fh, "<", $filename) { my $lock = flock $fh, LOCK_EX|LOCK_NB; if ($lock) { print 'Fertig!'; } else { print $meta; print 'Datei noch nicht freigegeben'; } } else { print $meta; print 'Datei ist noch nicht da'; } print $cgi->end_html; }
1 2 3 4
# am anfang open STDERR, '>>', '/my/log' or die "Could not open errorlog: $!"; ... open ... or die $!;
|< 1 2 >| | 17 Einträge, 2 Seiten |