diff options
author | Satoshi Asami <asami@FreeBSD.org> | 1999-06-22 06:47:21 +0000 |
---|---|---|
committer | Satoshi Asami <asami@FreeBSD.org> | 1999-06-22 06:47:21 +0000 |
commit | 3dc9d1aad20162de5c31028a8ed927f646874bb9 (patch) | |
tree | 474fa9d6dff2e61ad58aad3d3aadf5ab700e19f3 /Tools | |
parent | Setup a client machine. Unmounts all read-only mounts that looks like (diff) |
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.
Notes
Notes:
svn path=/head/; revision=19626
Diffstat (limited to 'Tools')
-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; +} |