#!/usr/bin/perl my $sid = getppid; # for the 'ps' process selection only if (my $pid = fork()) { sleep 1; # wait somewhat until tree of children is set up # show related processes system "ps f -s $sid -o pid,ppid,pgrp,sid,cmd"; # kill process group after timeout sleep 10; kill -9, $pid; wait; print "killed children\n"; # show remaining processes system "ps f -s $sid -o pid,ppid,pgrp,sid,cmd"; # do something else... sleep 10; } elsif (defined $pid) { # create new process group setpgrp; # run something (consisting of several processes) that hangs system 'bash -c "cat; echo"'; exit; } else { die "couldn't fork"; } #### $ ./698259.pl PID PPID PGRP SID CMD 2963 2960 2963 2963 bash 4074 2963 4074 2963 \_ /usr/bin/perl ./698259.pl 4075 4074 4075 2963 \_ /usr/bin/perl ./698259.pl 4076 4075 4075 2963 | \_ bash -c cat; echo 4077 4076 4075 2963 | \_ cat 4078 4074 4074 2963 \_ ps f -s 2963 -o pid,ppid,pgrp,sid,cmd killed children PID PPID PGRP SID CMD 2963 2960 2963 2963 bash 4074 2963 4074 2963 \_ /usr/bin/perl ./698259.pl 4079 4074 4074 2963 \_ ps f -s 2963 -o pid,ppid,pgrp,sid,cmd