car*_*ess 12 bash shell-script
可能的重复:
在指定时间内运行命令,如果时间超过则中止
当需要这样的命令时,我正在编写一个连续集成构建脚本。基本上,我需要启动一个具有设定时间限制的命令才能在它被杀死之前运行,并且一旦该命令在后台启动限时进程,所有正在进行的命令都应该立即运行,而不是等待它得到被杀。一种异步并发。
这是我的想象:
timelimited --limit=10 'somecommand --someoptions'
someothercommand //This gets launched immediately once 'timelimited' is done creating the background process
Run Code Online (Sandbox Code Playgroud)
Mat*_*teo 11
如果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
}
Run Code Online (Sandbox Code Playgroud)
BASH 常见问题条目 #68:“如何运行命令,并让它在 N 秒后中止(超时)?”
首先检查是否可以直接告诉您正在运行的命令超时。此处描述的方法是“hacky”变通方法,可强制命令在经过特定时间后终止。正确配置您的命令总是比下面的替代方案更可取。
如果该命令不支持在指定时间后停止,那么最好的替代方法是一些称为timeout和doalarm 的外部命令。一些 Linux 发行版
timeout
以包的形式提供 tct 版本。还有一个 GNU 版本的 timeout,包含在最近的 coreutils 版本中。