可能的重复:
运行命令指定时间,如果时间超过则中止
当需要这样的命令时,我正在开发一个持续集成构建脚本。基本上来说,我需要启动一个具有设定时间限制的命令,以便在它被杀死之前运行,并且一旦该命令在后台启动时间有限的进程,所有正在进行的命令都应该立即运行,而不是等待它得到被杀。一种异步并发。
这是我的想象:
timelimited --limit=10 'somecommand --someoptions'
someothercommand //This gets launched immediately once 'timelimited' is done creating the background process
答案1
如果timeout
和doalarm
不可用(例如,OS X),您可以使用expect
:
timeout() {
time=$1
# start the command in a subshell to avoid problem with pipes
# (spawn accepts one command)
command="/bin/sh -c \"$2\""
expect -c "set echo \"-noecho\"; set timeout $time; spawn -noecho $command; expect timeout { exit 1 } eof { exit 0 }"
if [ $? = 1 ] ; then
echo "Timeout after ${time} seconds"
fi
}
答案2
BASH 常见问题解答条目#68:“如何运行命令,并让它在 N 秒后中止(超时)?”
第一的检查是否可以直接告诉您正在运行的命令超时。这里描述的方法是“hacky”变通方法,用于强制命令在经过一定时间后终止。正确配置你的命令是总是优于以下替代方案。
如果该命令没有对在指定时间后停止的本机支持,那么最好的替代方案是一些称为暂停和警报。一些 Linux 发行版以
timeout
软件包的形式提供 tct 版本。还有一个 GNU 版本的超时,包含在最近的 coreutils 版本中。
答案3
另一种可能性是手动执行此操作。但是,只有当 Ignacio 在他的答案中建议的选项不可用时,我才会这样做:
timeout_f () {
$1 &
sleep $2
kill $! # ends somecommand if still running
}
timeout_f 'somecommand --someoptions' 10 && #need 2 &'s
echo "forked.." # happens immediately