Stefan: Perl-Skript mit "fork" funktioniert nicht als CGI

Beitrag lesen

Hallo Alexander,

OK, der Kindprozess vom CGI vielleicht nicht, oder vielleicht bekommt es das CGI auch einfach nicht mit. Bist Du sicher, dass nach dem Ende des CGI-Prozesses der Kindprozess noch läuft?

Laß statt der dummen Zahlen mal eine aktuelle Prozessliste rausschreiben (ps -ef oder ps aux, je nach Betriebssystem).

Wenn der Kindprozess schnell wieder verschwindet, aber dein CGI weiterläuft, bekommt es vom Kindstod nichs mit.

Erstmal habe ich den Path bereinigt:
-----------------------------------------------------------------------------

#!/usr/bin/perl -w -T
use strict;
use CGI::Carp qw(fatalsToBrowser);
use POSIX;
print "Content-type: text/html\n\n";

$ENV{'PATH'}='/bin:/usr/bin';

print qq~
<HTML>
<HEAD><TITLE>Test</TITLE></HEAD>
<BODY>
<tt>~;
my @returnvalue=();
$|=1;
pipe READFD,WRITEFD;
my $oh= select(WRITEFD); select($oh);
my $Kind_pid = fork();

die "Aua: $!\n" unless defined $Kind_pid;

if($Kind_pid) {
use POSIX ":sys_wait_h";
my $waitcount=1;
do {
my $Kind_pid = waitpid(-1,&WNOHANG);
#Wartenachricht hier
#print /bin/ps aux;
print "...".$waitcount;
$waitcount++;
sleep 2;
} until $Kind_pid == -1;
close(WRITEFD);
@returnvalue=<READFD>;
}
else {
my $cvs='';
sleep 10;
my @cvscan=/bin/echo "foobar";
close(READFD);
foreach $cvs (@cvscan){
#print $cvs."<br>\n";
print WRITEFD $cvs;
}
close STDOUT;
exit(0);
}

#Weitere Verarbeitung hier
print "\nAusgabe hier\n";
print @returnvalue;
print qq~
</tt>
</BODY>
</HTML>~;
-----------------------------------------------------------------------------
Aufruf an der Kommandozeile:
perl -T test.pl
Content-type: text/html

<HTML>
<HEAD><TITLE>Test</TITLE></HEAD>
<BODY>
<tt>...1...2...3...4...5...6...7...8...9...10...11...12...13...14
(Ctrl-C), denn es terminiert wieder nicht :-(
-----------------------------------------------------------------------------

Dann Dein Vorschlag bzgl. ps aux:
-----------------------------------------------------------------------------
geänderter Abschnitt:
if($Kind_pid) {
use POSIX ":sys_wait_h";

my $waitcount=1;

do {
my $Kind_pid = waitpid(-1,&WNOHANG);
#Wartenachricht hier
print /bin/ps aux;

print "...".$waitcount;

$waitcount++;

sleep 2;
} until $Kind_pid == -1;
close(WRITEFD);
@returnvalue=<READFD>;
}
-----------------------------------------------------------------------------
perl -T test.pl
Content-type: text/html

<HTML>
<HEAD><TITLE>Test</TITLE></HEAD>
<BODY>
<tt>
[viel Output gekürzt]
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
[...]
root 3561 6.6 0.7 6796 3076 /UNIONFS/dev/pts/0 S+ 08:23 0:00 perl -T test.pl
root 3563 0.0 0.7 6504 2856 /UNIONFS/dev/pts/0 S+ 08:23 0:00 perl -T test.pl
root 3570 0.0 0.2 4268 944 /UNIONFS/dev/pts/0 R+ 08:23 0:00 /bin/ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
[...]
root 3561 5.0 0.7 6796 3076 /UNIONFS/dev/pts/0 S+ 08:23 0:00 perl -T test.pl
root 3563 0.0 0.7 6504 2856 /UNIONFS/dev/pts/0 S+ 08:23 0:00 perl -T test.pl
root 3573 0.0 0.2 4268 944 /UNIONFS/dev/pts/0 R+ 08:23 0:00 /bin/ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
[...]
root 3561 4.0 0.7 6796 3076 /UNIONFS/dev/pts/0 S+ 08:23 0:00 perl -T test.pl
root 3563 0.0 0.7 6504 2856 /UNIONFS/dev/pts/0 S+ 08:23 0:00 perl -T test.pl
root 3576 0.0 0.2 4268 944 /UNIONFS/dev/pts/0 R+ 08:23 0:00 /bin/ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
[...]
root 3561 3.4 0.7 6796 3076 /UNIONFS/dev/pts/0 S+ 08:23 0:00 perl -T test.pl
root 3580 0.0 0.2 4268 944 /UNIONFS/dev/pts/0 R+ 08:23 0:00 /bin/ps aux
(Ctrl-C)

Der zweite Teil beendet sich, aber die Warteschleife bekommt's nicht mit.

So, jetzt warte ich auf Erleuchtung, großer Meister.

Gruß Stefan