my $status = 0; my $maxTime = shift @ARGV; my $runCmd = join ' ', @ARGV; my $child_pid; $SIG{ALRM} = sub { die "timeout" }; eval { alarm($maxTime); unless ($child_pid = fork) { exec $runCmd; die "could not exec $runCmd: $!"; } wait; alarm(0); }; if ($@) { if ($@ =~ /timeout/) { local $SIG{'HUP'} = 'IGNORE'; kill('HUP', $child_pid); $status = 1; } } exit $status;