in reply to Killing a process and, recursively, all its children

Just installed Proc::ProcessTable and discovered Proc::Killfam in the distribution. Very good!

Any better solution?

Ciao!
--bronto


The very nature of Perl to be like natural language--inconsistant and full of dwim and special cases--makes it impossible to know it all without simply memorizing the documentation (which is not complete or totally correct anyway).
--John M. Dlugosz
  • Comment on Update: Killing a process and, recursively, all its children

Replies are listed 'Best First'.
Re: Update: Killing a process and, recursively, all its children
by Aristotle (Chancellor) on Aug 13, 2003 at 00:43 UTC

    A better solution that doesn't involve using the module? Copypaste its source. Obviously it works.

    Is there any reason you'd want to roll your own?

    Makeshifts last the longest.

      Is there any reason you'd want to roll your own?

      None, actually; Proc::Killfam does just what I was looking for. But there are so many modules on CPAN and so many experts Perl programmers here that I could well have missed a better module for the task that somebody here knew about. That was what I was asking for. But it seems that I already found the right one.

      Ciao!
      --bronto


      The very nature of Perl to be like natural language--inconsistant and full of dwim and special cases--makes it impossible to know it all without simply memorizing the documentation (which is not complete or totally correct anyway).
      --John M. Dlugosz
        Hi, I needed to kill the child processes recursively and went through all the suggestions on this thread and the related. Thanks for everybody's input. While killfam is great, i wanted to see if there was a non module way of doing this(in our environment, i am discouraged to install modules unless its absolutely needed). So i have done it using setpgrp. I just want to share that here. Below is a sample:
        #!/usr/bin/perl -w use strict; use POSIX "WNOHANG"; setpgrp(0, 0); if(my $pid = fork) { #parent print "RESULT: $pid\n"; my $kid; my $count; do { $kid = waitpid(-1, WNOHANG); sleep 1; $count++; if ($count > 15) { print "I have waited too long. self destructin +g\n"; my $GID = getpgrp($pid); `kill -9 -$GID`; } } until $kid == $pid; } else { #child local $SIG{CHLD} = sub { wait() }; system("sleep 100"); exit; } print "I am all done\n";