diff options
-rwxr-xr-x | Tools/portbuild/scripts/ptimeout | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/Tools/portbuild/scripts/ptimeout b/Tools/portbuild/scripts/ptimeout new file mode 100755 index 000000000000..53e28b77c3ae --- /dev/null +++ b/Tools/portbuild/scripts/ptimeout @@ -0,0 +1,38 @@ +#!/usr/bin/perl -w +# ptimeout: executes command but kills it after a specified timeout +# usage: ptimeout timeout command args ... +$timeout=$ARGV[0]; +splice(@ARGV, 0, 1); +#print "timeout is ", $timeout, "\n"; +#print "arguments are ", "@ARGV", "\n"; +if ($pid1 = fork) { + if ($pid2 = fork) { + # parent + #print 'child pids are ', $pid1, ' ', $pid2, "\n"; + $child=wait; + $status=$?; + #print "exited child is $child, status is $status\n"; + if ($pid1 = $child) { + #print "killing process $pid2\n"; + kill 'TERM', $pid2; + } + else { + #print "killing process $pid1\n"; + kill 'TERM', $pid1; + } + # exit status in upper 8 bits, killed signal (if any) in lower 8 bits + exit (($status >> 8) | ($status & 0xff)) ; + } + else { + # second child + sleep $timeout; + print "ptimeout: killing @ARGV (pid $pid1) since timeout of $timeout expired\n"; + kill 'TERM', $pid1; + exit 1; + } +} +else { + # first child + print "executing @ARGV\n"; + exec @ARGV; +} |