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