eduardoll has asked for the wisdom of the Perl Monks concerning the following question:

Hi All, How can i make the code below to run in background (windows xp) until the command ends?

The command is similar to "perl main.pl a b c d e". If i put this command at #child place, the script (main.pl) runs until it terminates but the html page (#parent place) is only loaded after the script ends. I want to display the html page as soon as the script starts.

If i change the code between #child and #parent fields, the html is displayed instantly but the script (main.pl) is killed and is not executed to the end.
use warnings; use strict; $| = 1; # need either this or to explicitly flush stdout, etc. # before forking print "Content-type: text/plain\n\n"; print "Going to start the fork now\n"; if ( !defined(my $pid = fork())) { print STDERR "fork error\n"; exit(1); } elsif ($pid == 0) { # child close(STDOUT);close(STDIN);close(STDERR); exec('perl main.pl a b c d e'); # lengthy processing } else { # parent print "forked child \$pid= $pid\n"; exit 0; } __END__

This script main.pl takes at least 5 minutes running. This is the reason that i can't wait the script terminates.

My main.pl script will receive a huge file from a form and parse the file into a database. After this process, some configurations from the database that the user has just populated will appear on screen to the user..

Thanks!

Replies are listed 'Best First'.
Re: Exec command running in background after a fork
by 1Nf3 (Pilgrim) on May 22, 2009 at 14:19 UTC

    A while ago, I wrote some chessgame-analysis-related program. The analysis process took a looong while, so I had to find a way to execute the external analysis utility in the background.

    I'm not sure whether the same solution will be used here, but here is the command execution part:

    system 1, 'perl main.pl a b c d e';

    The Documentation advises against the use of exec (see http://perldoc.perl.org/functions/exec.html), so I'd use system instead.

    Hope that halps.

    Regards,
    Luke

Re: Exec command running in background after a fork
by Bloodnok (Vicar) on May 22, 2009 at 14:30 UTC
    Hmmm ,

    The problem would appear to be that you spawned a child, told it to go away and do something and then neglected to hang around waiting for your child to finish e.g.

    . . } else { # parent print "forked child \$pid= $pid\n"; wait(); # Added exit 0; } . .

    A user level that continues to overstate my experience :-))