use strict; use warnings; #Because `system' and backticks block `SIGINT' and #SIGQUIT', killing the program they're running #doesn't actually interrupt your program. $SIG{HUP} = \&shutdown; # $SIG{CHLD} = 'IGNORE'; # wait() doesn't see child die if this isn't commented my %PIDPOOL = (); my $continue = 1; for( my $x = 1; $x < 3; $x++) { setupProcess( $x ); } while( $continue ) { my $pid = wait(); if( $pid > 0 ) { my $process = $PIDPOOL{ $pid }; print "Process $process ended...\n"; setupProcess( $process ); } } sub shutdown { $continue = 0; foreach my $pid ( keys %PIDPOOL ) { print "$pid\n"; kill 9, $pid; } print "Shutting down...\n"; while( ( my $pid = wait() ) != -1 ) { print "$pid killed on shutdown of parent process...\n"; } } sub setupProcess { my $process = shift; my $pid = fork(); if( $pid ) { $PIDPOOL{ $pid } = $process; } else { print "$process, $pid started, ...\n"; close STDERR; # stop permission denied messages exec( q[find / -name ifconfig] ) or die($!); # exec( q[ssh bobn@trc1] ) or die($!); } }