Beefy Boxes and Bandwidth Generously Provided by pair Networks
laziness, impatience, and hubris

Re^4: forkManager PID 1 less than top

by vsespb (Chaplain)
on Oct 02, 2013 at 17:43 UTC ( #1056656=note: print w/replies, xml ) Need Help??

in reply to Re^3: forkManager PID 1 less than top
in thread forkManager PID 1 less than top

Where did you find the code example you posted?
I edited first example (in SYNOPSIS) here.
I should have expected this since system probably starts it's own child process.
or if the actual offset is subject to system timing?
having said all that I am really not sure how to properly work around this.
Why do you need exactly the PID which do the work?

in general this problem is hard to solve..
You can use something like this:
use Parallel::ForkManager; $pm = new Parallel::ForkManager(100); my @all_data = qw/1/; foreach $data (@all_data) { # Forks and returns the pid for the child: my $pid = $pm->start; print "PID $pid\n"; $pid and next; print "$data", "\n"; my $pid2 = fork(); unless ($pid2) { exec $^X, '-e', 'while(){}'; } print "Real PID $pid2\n"; waitpid $pid2, 0; $pm->finish; # Terminates the child process } $pm->wait_all_children;
i.e. use "exec", "fork" and "wait/waitpid" calls.

Note that I don't recommend putting it into production until you fully understand how those functions works.
Also this example won't work if you replace
exec $^X, '-e', 'while(){}';
exec "perl -e 'while(){}'";
those calls are equivalent, but former calls PERL, and later one calls SHELL, which will call PERL.
so with later one you'll get wrong pid again (PID of shell)

Also, you really cannot control if scripts, that you call are calling other scripts or other processes or no

Thus this task is hardly solvable.

I propose explain you business requirements (exactly why you need that PID who do works) and someone might suggest something.

Replies are listed 'Best First'.
Re^5: forkManager PID 1 less than top
by MAR99 (Initiate) on Oct 03, 2013 at 17:06 UTC

    Thanks for the detailed response. I was worried that this was going to turn into a subtle and problematic situation per your response. I will study what you have written on exec, but it does sound like the whole thing is a little touchy

    Basically the reason I was hoping for correlation between the forkManger & top cmd PIDs is as follows. Lets say I submit 3 jobs(call them j1,j2,j3) using my forkManager code. During the submission process my code prints to stnd out log info related to the submission flow. ie j1:PID=123, j2:PID=130, j3:PID=140, etc. It also keeps track of when the jobs complete via the forkManager. These jobs dont all run at the same rate, some run for hrs or even days. At some point while the jobs are still running I may decide that the j2 is no longer needed. So I would like to go into my log and find the PID for the the thing I symbolically know an love as j2. I would like to be able to use that logged PID to issue a kill on said PID. The problem is that the PID as reported in 'top' are not what is stored in the log. Hence the log PIDs can't be used to issue the kill cmd.

    Frankly correlation is not an absolute requirement. But never the less, it would have been nice. So unless someone comes up with an easy, bullet proof fix for this. I most likly wont be killing myself to make it happen. I'm not sure I am versed enough to work around all the potential land mines to which you eluded.

      Easiest way probably to just kill the all child PIDs using this SHELL command.
      ps h --ppid $PID -o pid|xargs kill
      (optionally you can also kill $PID)

      see here

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://1056656]
[Copacetic]: I've just done that (after replacing a > with a HTML code). This doesn't seem to help with the post, though.

How do I use this? | Other CB clients
Other Users?
Others exploiting the Monastery: (9)
As of 2017-05-26 15:00 GMT
Find Nodes?
    Voting Booth?