Login | Register For Free | Help
Search for: (Advanced)

Mailing List Archive: ModPerl: ModPerl

external process

 

 

ModPerl modperl RSS feed   Index | Next | Previous | View Threaded


rperry at restorehc

Jun 19, 2012, 9:09 AM

Post #1 of 2 (377 views)
Permalink
external process

I'm having trouble with running an external program. It seems to work the
first few times I do it, then it gets stuck and I have to restart httpd
with kill -9. I've tried things a few different ways. Here is what I'm
currently doing:

my $pm = new Parallel::ForkManager(6);


for my $thing_to_do(@things) {
# Forks and returns the pid for the child:
my $pid = $pm->start and next;
my $command=q{/public_html/perl/detach.pl};
$command . ' ' . $thing_to_do;

`$command`;
### I've also tried: $r->spawn_proc_prog ($fc); ###

$pm->finish; # Terminates the child process
}
$pm->wait_all_children;


I'm sure this is "simple". Where have I gone wrong?


--
*Ryan Perry*
Technology Director
RestoreHealth
1289 Deming Way
Madison, WI 53717
608.833.7046 ext 700
rperry [at] restorehc


randolf at modperl

Jun 19, 2012, 10:17 AM

Post #2 of 2 (349 views)
Permalink
Re: external process [In reply to]

> I'm having trouble with running an external program. It seems to work the
> first few times I do it, then it gets stuck and I have to restart httpd
> with kill -9. I've tried things a few different ways. Here is what I'm
> currently doing:
>
> my $pm = new Parallel::ForkManager(6);
>
>
> for my $thing_to_do(@things) {
> # Forks and returns the pid for the child:
> my $pid = $pm->start and next;
> my $command=q{/public_html/perl/detach.pl};
> $command . ' ' . $thing_to_do;
>
> `$command`;
> ### I've also tried: $r->spawn_proc_prog ($fc); ###
>
> $pm->finish; # Terminates the child process
> }
> $pm->wait_all_children;
>
>
> I'm sure this is "simple". Where have I gone wrong?

The sample code on this web page helped me:

http://perl.apache.org/docs/2.0/api/Apache2/SubProcess.html

I'm not sure what "$fc" is, but if it is the full command with
arguments, then that will not work for arguments needs to be
specified separately:

# pass @ARGV but don't ask for any communication channels
$command = "/tmp/argv.pl";
@argv = qw(foo bar);
$r->spawn_proc_prog($command, \@argv);

The above example comes from the above page, and it will run the
process as detached. In some environments the command needs to be
the perl binary itself (such as Microsoft's Widows) with the script
being one of its arguments.

Also note that if you shut down Apache HTTPd that your spawned
process will also be terminated, but this is trivially resolved by
making your process truly detached with the following two lines added
appropriately in your "detached" script (I use this in production and
find it works very well):

use POSIX 'setsid';
setsid();

I'm assuming the "detached" requirement because of the name you
chose for your script. If you actually need to communicate with your
script (e.g., receive its output, etc.) then detaching from it may
not be exactly what you need, and in which case the web page I
referenced above explains how to do that with the other examples
under the "Synopsis" heading.

I hope this helps.

Randolf Richardson - randolf [at] inter-corporate
Inter-Corporate Computer & Network Services, Inc.
Beautiful British Columbia, Canada
http://www.inter-corporate.com/

ModPerl modperl RSS feed   Index | Next | Previous | View Threaded
 
 


Interested in having your list archived? Contact Gossamer Threads
 
  Web Applications & Managed Hosting Powered by Gossamer Threads Inc.