From 3dc9d1aad20162de5c31028a8ed927f646874bb9 Mon Sep 17 00:00:00 2001 From: Satoshi Asami Date: Tue, 22 Jun 1999 06:47:21 +0000 Subject: A perl script to run a command with a timeout. The command is killed if it doesn't complete within the specified timeout period. I tried to do this from within the pdispatch script, but I couldn't get all the auxiliary processes to be killed correctly so implemented this as a separate script in perl. --- Tools/portbuild/scripts/ptimeout | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100755 Tools/portbuild/scripts/ptimeout (limited to 'Tools') 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; +} -- cgit v1.2.3