freebsd-ports/Tools/portbuild/scripts/ptimeout

41 lines
1 KiB
Perl
Executable file

#!/usr/bin/perl -w
# ptimeout: executes command but kills it after a specified timeout
# usage: ptimeout timeout command args ...
require "ctime.pl";
$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 at ", &ctime(time);
kill 'TERM', $pid1;
exit 1;
}
}
else {
# first child
#print "executing @ARGV\n";
exec @ARGV;
}