summaryrefslogtreecommitdiff
path: root/Tools
diff options
context:
space:
mode:
authorSatoshi Asami <asami@FreeBSD.org>1999-06-22 06:47:21 +0000
committerSatoshi Asami <asami@FreeBSD.org>1999-06-22 06:47:21 +0000
commit3dc9d1aad20162de5c31028a8ed927f646874bb9 (patch)
tree474fa9d6dff2e61ad58aad3d3aadf5ab700e19f3 /Tools
parentSetup 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-xTools/portbuild/scripts/ptimeout38
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;
+}