有没有办法在设定的时间限制内调用命令并在时间过去后终止它?

有没有办法在设定的时间限制内调用命令并在时间过去后终止它?

可能的重复:
运行命令指定时间,如果时间超过则中止

当需要这样的命令时,我正在开发一个持续集成构建脚本。基本上来说,我需要启动一个具有设定时间限制的命令,以便在它被杀死之前运行,并且一旦该命令在后台启动时间有限的进程,所有正在进行的命令都应该立即运行,而不是等待它得到被杀。一种异步并发。

这是我的想象:

timelimited --limit=10 'somecommand --someoptions'
someothercommand //This gets launched immediately once 'timelimited' is done creating the background process

答案1

如果timeoutdoalarm不可用(例如,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

相关内容