foreach my $node (@nodes) { chomp $node; wait_for_a_kid() if keys %pid_to_node > 4; if (my $pid = fork) { ## parent does... $pid_to_node{$pid} = $node; } else { local $SIG {ALRM} = sub { kill -15, $pid or die "kill: $!"; print "Killed PID $pid\n"}; eval { unless ($pid) { ## child does... setpgrp(0,0); exit !&NODE($node); } alarm 15; waitpid $pid => 0; }; } } ## final reap: 1 while wait_for_a_kid(); sub wait_for_a_kid { my $pid = wait; return 0 if $pid < 0; my $node = delete $pid_to_node{$pid} or warn("Why did I see $pid ($?)\n"), next; 1; } #### #!/bin/perl for ($i=0; $i<=10; $i++) { wait_for_a_kid() if keys %pid_to_node > 3; $pid = fork; if ($pid) { ## parent does... $pid_to_node{$pid} = $i; } else { print "$i $$\n"; local $SIG {ALRM} = sub { kill -15, $$ or die "kill: $!"; print "\tKilled PID $$\n"}; # Just SIGTERM. eval { ## child does... setpgrp(0,0); exit !&Test; alarm 1; waitpid $pid => 0; }; } } ## final reap: 1 while wait_for_a_kid(); sub wait_for_a_kid { my $pid = wait; return 0 if $pid < 0; my $node = delete $pid_to_node{$pid} or warn("Why did I see $pid ($?)\n"), next; } sub Test { sleep 10; }