对于 Linux 工程师,我们每天面对的最多的就是黑乎乎的终端,以及在终端里敲入的各种命令。在使用 Linux 系统的过程中,我们有时候会碰到下面这几种场合:
-
一个命令/程序在运行过程中需要花费很长时间,而在这期间系统可能处于假死状态,我们点击什么都没反应,只好等待或重启系统; -
我们只是想让命令/程序运行一段特定时间,比如 3 秒,时间点一到就希望命令/程序停止运行; -
命令/程序的 log 输出太快,但我们只需要一段时间的 log ,比如 10 秒。
为了满足这几种需求,本文介绍两种方法。我们有两种方法来实现这样的需求。
方法1:使用 timeout 命令
timeout
命令简直就是为这些需求而生!它可以将命令/程序的运行时间限定在你所指定的时间里。当时间到达之后,它会自动向所运行的命令/程序发送一个信号,中止这个命令/程序的运行。
timeout
命令已经存在 GNU 的软件库中,所以我们无需安装,可以直接使用。
该命令的一般使用方法是这样的:
$ timeout command>
例如,按下面这种方式执行命令,程序将在 10 秒后自动中止运行。
$ timeout 10s tail -f /var/log/pacman.log
以上这条命令,参数 10s 表示指定程序运行的时间,其中 s 是单词 second 的缩写,代表秒,也可以省略不写(默认为秒)。除了秒这个单位,还有分钟、小时等。
-
m – 分钟 -
h – 小时 -
d – 天
如果不加以限制的话,直接执行 tail -f /var/log/pacman.log
的话,它会一直打印信息,直到你按 ctrl+c
为止。
前文提到,timeout
命令在命令/程序运行到指定时间之后,将会发送一个信号给该命令/程序。默认情况下这个命令是 SIGKILL
,当然你也可以指定它发送其它信号,这个时候你就需要使用它的 -k
选项了。
$ timeout -k 20 10 tail -f /var/log/pacman.log
上面的命令执行完之后,到达指定时间它将会发送代号为 20 的信号给 tail
命令,使其中止运行。代号 20 的信号是 SIGSTP
信号,所有支持的信号可使用以下命令查询:
$ kill -l
在对内核进行调试的时候,内核将一直输出 log ,所以这时候 timeout
命令就非常有用。例如我们只想查看内核 10 秒内所发送的信息,可以使用下面这条命令:
$ timeout 10 dmesg -w
当然 timeout
命令还有很多其它功能,有兴趣的小伙伴可以使用 man timeout
命令来获取更多信息。
方法2:使用 timelimit 命令
timelimit
命令的功能与 timeout
命令相似,但它提供了更多选项供我们使用。和 timeout
命令一样你可以指定发送的信号,为了防止信号的丢失,你还可以指定信号发送次数。因此,timelimit
命令更加灵活,同时也更加可靠。
不仅如此,在发送我们所指定的信号之前,它还可以发送警告信号。
但是,GNU Linux 系统没有预先安装timelimit
命令,所以不能直接使用。对于 Debian 发行版,你可以使用 apt-get
命令进行安装:
$ sudo apt-get install timelimit
其它操作系统可以使用所对应的安装方式,或者使用源码安装。
命令安装完之后,我们就可以正常使用 timelimit
命令了。前文所举的例子,如果使用 timelimit
命令来实现的话,可以这样写:
$ timelimit -t10 tail -f /var/log/pacman.log
在不带任何参数的情况下,timelimit
命令的默认选项参数如下:
warntime=3600 seconds
、 warnsig=15
、 killtime=120
、killsig=9
如果想要了解更多 timelimit
命令的用法,可以使用 man timelimit
命令来查看。