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; }