如何在Bash中设置进程超时运行?
在Bash中如何运行一个带有超时的进程?
有一个命令叫做timeout
可以使用:
timeout 15s command
注意:在一些系统上,你需要安装coreutils
,在其他系统上,它可能缺失或具有不同的命令行参数。可以看到由某人发布的替代解决方案。基于它,你可以封装这个模板代码并创建自己的便携式timeout
脚本或者相同功能的小型C应用程序。
更不用说如果命令提前完成,它会立即返回。
所以对于我尝试在15秒后终止的命令,我尝试了这个命令,但是它没有停止命令的运行,我还尝试使用timeout -k 15
,但也没有起作用:(
这是你运行命令的方式。
timeout
命令是从哪里来的?在我所在的任何RHEL或Ubuntu服务器上都没有这个命令。(对于FreeBSD或OS X也是如此。)
它在我的debian系统的coreutils 8.x中。
我一直在研究这个问题,我发现timeout
不是一种可移植的方法。有两种流行的实现timeout
的方式,具有稍微不同的特性。一种是TCT的一部分,另一种是coreutils的一部分。我现在在一个RHEL机器上有一个不常见的实现(我不维护它,所以我不知道是谁安装的),它有完全不同的标志(例如,用于设置超时的-t
)。
谢谢,我在debian、ubuntu、centos和cygwin上都使用过它,都正常工作。
- 是的,我认为只有偶尔的机器没有安装coreutils实现。
coreutils将在FreeBSD、NetBSD、OS X、HP/UX、Solaris、AIX等任何系统中不存在。
在OS X上,如果使用homebrew安装了coreutils
,那么这个命令可以用gtimeout
来使用。
这对于简单的命令超时很好,但是对于带引号的参数和多个命令,引号的混乱就开始了,例如这个晦涩的例子:timeout 5s sh -c "while true; do echo \"\\\"quoted\\\"\"; sleep 1; done"