Beefy Boxes and Bandwidth Generously Provided by pair Networks
P is for Practical

Re^3: How to make perl script work simltaneously on multiple objects

by McA (Priest)
on Apr 01, 2013 at 06:43 UTC ( #1026428=note: print w/replies, xml ) Need Help??

in reply to Re^2: How to make perl script work simltaneously on multiple objects
in thread How to make perl script work simltaneously on multiple objects


if you fork a perl script which does have all to process the job it should be quite easy as you don't need to exec and you do have everything in hands. Anything you set up before fork is also accessible in the child. Be careful. Memory usage is multiplied.

There a some points you have to be aware of:

  • Childs inherit open io handles. If you don't need them close them in childs.
  • If you have a DBI handle the childs inherit it. The DESTROY handler of DBI is shutting down the connection when childs exit. So look at manpage of DBI concerning DBI and forking.
  • Make a SIGCHLD handler for reaping of just for setting flags to reap in parent. waitpid is your friend. Sometimes it's nice to call the non-blocking version of waitpid.
  • Be aware that the SIGCHLD handler interrupts a sleep(), so that this sleep may be much less than the amount of seconds specified.


Replies are listed 'Best First'.
Re^4: How to make perl script work simltaneously on multiple objects
by slayedbylucifer (Scribe) on Apr 05, 2013 at 06:11 UTC

    Hi McA,

    I had a developer colleague of mine help me on writing below fork code (after following your advice).

    #!/usr/bin/perl -w use strict; use POSIX; my @list=("server1","server2","server3","server4","server5","server6", +"server7","server8"); my $count = 0; my $pcount = 5; foreach (@list) { chomp ; my $real_host = $_; if( (my $pid = fork()) == 0) { print "Processing - $_ \n"; my $wait=ceil(rand(10)); print "Wait:$wait \n"; sleep($wait); print "Exit Status= $? \n"; if($? ==0) { print "$_ Exit successfully \n"; } else { print "$_ Does not Exit successfully \n"; } print "Completing - $_ \n"; exit; } $count++; while($count >= $pcount) { wait(); $count--; } } while(wait() != -1){}

    I still donít understand few parts of this code but I am OK with that. This test code is working perfectly. So I am planning to use the same logic in my orchestrator.

    Many thanks for your help.

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://1026428]
[GotToBTru]: late to the conversation .. but thanks, Corion, for the reminder about Perl::Tidy
[Corion]: GotToBTru: Heh ;) I'm not really endorsing it, as I found that any gains made through it are easily squandered by the hours spent on configuring it. At least in my case :)
[GotToBTru]: Like most Swiss Army Knives, you can cut yourself trying to find the blade you actually want

How do I use this? | Other CB clients
Other Users?
Others studying the Monastery: (11)
As of 2017-02-27 14:28 GMT
Find Nodes?
    Voting Booth?
    Before electricity was invented, what was the Electric Eel called?

    Results (387 votes). Check out past polls.