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

I'm using perl5.6.1 and am trying to debug a program that creates a background process via a system call. The following is the affected code.
if ( $pid eq "" ) # if null, MEVS not running - issue comm +and to start MEVS { @command = ("/mevs/$version/bin/mevs", "/mevs/$version/data/con +fig_data/mevs2.cfg", "online"); system(@command, "&"); # restart MEVS $pid = get_pid($version); # Get the current $version mevs pid chomp $pid; # chomp if not null print STATUSLOG "\n\n$ctime [$pid] -- MEVS Status Log -- The M +EVS Online process has been restarted\n\n";
The problem is that the debugger goes into a wait state for a response as the following shows:
DB<1> b 151 DB<2> c MEVS 2.0, Medicaid Eligibility Verification Server, (c)2003. Done. 12/07/04 @ 11:13:41 : MEVS started in Online mode, on port 6500, with +20 listening slots.
I no longer get any DB<> prompts. It seems it just hangs. I know I created a background process because I can kill the perl process and the MEVS system is still running.

Replies are listed 'Best First'.
Re: debugger problem with system calls
by tilly (Archbishop) on Dec 07, 2004 at 17:01 UTC
    You are not, contrary to your belief, launching a background process.

    If you call system with a list of arguments it is not interpreted by the shell, instead Perl launches the appropriate process with the list of arguments passed in directly (so shell metacharacters are not interpreted as such).

    You want to do something more like:

    system(join " ", @command, "&");
    As for your test from which you believed that the process was backgrounded, under Unix if you create a child process and then kill the parent, the child process just continues and is reparented. So your test for whether you created a background process only really tested to show that you created a process.
      Thank you very much for your help. Gerry