summaryrefslogtreecommitdiffstats
path: root/Tools/portbuild
diff options
context:
space:
mode:
authorasami <asami@FreeBSD.org>1999-06-22 06:47:21 +0000
committerasami <asami@FreeBSD.org>1999-06-22 06:47:21 +0000
commitae29a41bdc2cd5bfcfbdbe657344a6473d28ef68 (patch)
treeb41d2903aa04aadcd58bf2ebda1d4a244844edd4 /Tools/portbuild
parentdb214e395ed16f36edbd8644ddc649c7da5bb309 (diff)
downloadFreeBSD-ports-ae29a41bdc2cd5bfcfbdbe657344a6473d28ef68.zip
FreeBSD-ports-ae29a41bdc2cd5bfcfbdbe657344a6473d28ef68.tar.gz
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.
Diffstat (limited to 'Tools/portbuild')
-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 0000000..53e28b7
--- /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;
+}
OpenPOWER on IntegriCloud