#!/usr/bin/perl use strict; use warnings; use Parallel::ForkManager; my $pm = Parallel::ForkManager->new( 6 ); my %kids; local $SIG{ INT } = sub { print "\nCaught interrupt, shutting down..."; kill 9, keys %kids; $pm->wait_all_children; print "done.\n"; exit; }; # Remove child pid from running table $pm->run_on_finish( sub { my $pid = shift; delete $kids{ $pid }; } ); for my $job ( @jobs ) { # Whatever if ( my $pid = $pm->start ) { $kids{ $pid }++; print "Started $job...\n"; } else { local $SIG{ INT } = sub { $pm->finish }; system( $job ); $pm->finish; } } $pm->wait_all_children;