计时运行命令

见过好几个人问怎样可以计时运行某一个命令?比如我可能想运行某个交互式的命令(像fdisk),但我又不想让它一直永远等待输入,我就得给它指定一个时间,若没有输入则自动退出。

我之前也遇到过这个问题,当时找到的是timed-run。而最近我发现coreutils里面已经默默包含了一个等价的命令——timeout。

timed-run来自expect包,很明显是用expect脚本写的:

% cat /usr/bin/timed-run
#!/bin/sh
# 
exec expect -f "$0" ${1+"$@"}
# run a program for a given amount of time
# i.e. time 20 long_running_program

set timeout [lindex $argv 0]
eval spawn [lrange $argv 1 end]
expect

而timeout则来自coreutils,应该是用C写的。它们的用法都一样,后面第一个参数是指定的时间,在后面就是要运行的命令,比如:timeout 1 sleep 10。timeout还能接受一些选项,更强大一些。