timeout命令详解

timeout命令用于为执行其他命令设置一个时间限制-。如果被监控的命令在指定时间内没有完成,timeout就会终止它-。它通常用于防止某个命令因意外而无限期运行-。

timeoutGNU coreutils软件包的一部分,因此几乎在所有的Linux发行版中都预装了。

基本语法

timeout [选项] 持续时间 命令 [命令参数...]

常用选项

选项说明
-s, --signal=<信号>指定超时发生时发送的信号,默认为SIGTERM
-k, --kill-after=<持续时间>在发送初始信号后,若命令仍未结束,再等待指定的时间后发送SIGKILL信号强制终止。
--preserve-status即使命令超时,也返回该命令的退出状态,而不是默认的124
--foreground当需要命令与终端(TTY)交互时使用,可避免因创建新进程组而导致的问题。
-v, --verbose在超时发送信号时,向标准错误输出诊断信息。

持续时间格式

持续时间可以是一个浮点数,并支持以下后缀:

  • s:秒(默认)

  • m:分钟

  • h:小时

  • d:天

例如,1.5m等同于 90 秒。如果将持续时间设为0,则会禁用超时功能。

退出状态

timeout命令的退出状态可以帮助判断执行结果:

  • 124:被监控的命令超时(且未使用--preserve-status选项)。

  • 125timeout命令自身执行失败。

  • 126:找到了命令,但无法执行。

  • 127:未找到要执行的命令。

  • 137:命令被SIGKILL(9) 信号杀死。

  • 其他:被监控命令正常退出时的状态码。

使用示例

1. 基本用法:限制命令运行时间

ping命令运行5秒后自动停止-:

timeout 5s ping www.baidu.com

2. 指定超时信号

默认发送SIGTERM信号,可以用-s选项指定发送SIGKILL信号:

timeout -s SIGKILL 3s sleep 30

3. 使用--kill-after优雅终止

给命令5秒时间自行结束(SIGTERM),如果3秒后仍未退出,则强制杀死(SIGKILL)。此例中命令最长运行5 + 3 = 8秒。

timeout -k 3s 5s 你的命令

4. 保留被监控命令的退出状态

使用--preserve-status,当command超时时,timeout也会返回command自身的退出码。

timeout --preserve-status 5s 你的命令

5. 处理交互式命令

对于需要从终端读取输入的命令(如sshtop),使用--foreground选项可以避免交互问题。

timeout --foreground 10s top

注意事项

  • 默认信号SIGTERM可以让进程有机会进行清理工作(如保存数据、关闭文件),但进程也可以选择忽略它。

  • 子进程问题timeout默认会创建一个新的进程组来运行目标命令。这意味着它主要监控的是直接启动的进程,其子进程(孙进程)可能成为孤儿而继续运行。

  • 极短超时:设置非常短(如亚秒级)的超时时间可能因系统调度开销而不够精确-6。

  • 2038年问题:在某些平台上,不支持设置超过2038年的超时时间。

  • 查看完整手册:在终端中,可以使用info coreutils 'timeout invocation'命令查看更完整的官方文档。