mirror of
https://git.FreeBSD.org/ports.git
synced 2024-11-24 00:45:52 +00:00
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.
This commit is contained in:
parent
9478eafe5e
commit
3dc9d1aad2
Notes:
svn2git
2021-03-31 03:12:20 +00:00
svn path=/head/; revision=19626
38
Tools/portbuild/scripts/ptimeout
Executable file
38
Tools/portbuild/scripts/ptimeout
Executable file
@ -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;
|
||||
}
|
Loading…
Reference in New Issue
Block a user