如何在Bash中设置进程超时运行?

24 浏览
0 Comments

如何在Bash中设置进程超时运行?

有没有办法编写一个shell脚本,在执行某个命令15秒后,将其终止?\n我尝试了sleep、wait和ping,但可能使用方法不对。

0
0 Comments

一些机器上没有安装或可用的timeout命令。在这种情况下,可以将进程放入后台,进程的PID存储在$!中,然后休眠所需的时间,然后杀死进程:

some_command arg1 arg2 & 
TASK_PID=$!
sleep 15 
kill $TASK_PID 

在这个URL(http://mywiki.wooledge.org/BashFAQ/068)上,提到了不止一种解决方法来实现这个目标。

我最初删除了我的答案(因为显然Karoly的答案更棒),但是似乎有些人没有timeout命令,所以我将它恢复了。

0
0 Comments

在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"

0