如何在Bash中以超时方式运行进程?

120

2
通常情况下,您会使用ALARM信号并捕获它。但是命令实用程序timelimit看起来很有前途。 - Konerak
1
谁将此标记为离题?:/ - Karoly Horvath
2个回答

239
使用timeout命令:
timeout 15s command

注意:在某些系统上,您需要安装 coreutils,在其他系统上,它可能缺失或具有不同的命令行参数。请参阅由 @ArjunShankar 发布的备用解决方案。基于该解决方案,您可以封装那个样板代码并创建自己的便携式 timeout 脚本或小型 C 应用程序来完成同样的任务。


3
不用提,如果命令提前完成,它将立即返回。 - Karoly Horvath
1
timeout命令是从哪里来的?我在我所使用的任何RHEL或Ubuntu服务器上都没有它。(事实上,在FreeBSD或OS X上也没有。) - ghoti
1
它在我的 Debian 系统的 coreutils 8.x 中。 - Graham
1
Coreutils 在 FreeBSD、NetBSD、OS X、HP/UX、Solaris、AIX 等操作系统中都是缺失的。 - Graham
3
在OS X上使用Homebrew安装的coreutils,该命令可用作gtimeout - joeln
显示剩余6条评论

66

有些机器上没有安装或不可用timeout。这种情况下,您可以将进程放到后台运行;它的PID将作为$!存储;然后休眠所需的时间,最后杀死它:

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

这个网址中,提到了不止一种解决方法来实现这个目标。


6
我最初删除了我的回答(因为Karoly的回答显然更棒),但似乎有些人没有“超时”=>取消删除。 - ArjunShankar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接