if (my $pid = fork()) { wait; } elsif (defined $pid) { setpgrp; # create new process group eval { local $SIG{ALRM} = sub { die "alarm\n" }; alarm 5; system 'bash -c "cat; echo"'; # run something (several processes) that hangs alarm 0; }; if ($@ eq "alarm\n") { kill 9, 0; # kill current process group } exit; }