timeout命令详解
timeout命令用于为执行其他命令设置一个时间限制-。如果被监控的命令在指定时间内没有完成,timeout就会终止它-。它通常用于防止某个命令因意外而无限期运行-。
timeout是GNU 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选项)。125:timeout命令自身执行失败。126:找到了命令,但无法执行。127:未找到要执行的命令。137:命令被SIGKILL(9) 信号杀死。其他:被监控命令正常退出时的状态码。
使用示例
1. 基本用法:限制命令运行时间
让ping命令运行5秒后自动停止-:
timeout 5s ping www.baidu.com2. 指定超时信号
默认发送SIGTERM信号,可以用-s选项指定发送SIGKILL信号:
timeout -s SIGKILL 3s sleep 303. 使用--kill-after优雅终止
给命令5秒时间自行结束(SIGTERM),如果3秒后仍未退出,则强制杀死(SIGKILL)。此例中命令最长运行5 + 3 = 8秒。
timeout -k 3s 5s 你的命令4. 保留被监控命令的退出状态
使用--preserve-status,当command超时时,timeout也会返回command自身的退出码。
timeout --preserve-status 5s 你的命令5. 处理交互式命令
对于需要从终端读取输入的命令(如ssh,top),使用--foreground选项可以避免交互问题。
timeout --foreground 10s top注意事项
默认信号:
SIGTERM可以让进程有机会进行清理工作(如保存数据、关闭文件),但进程也可以选择忽略它。子进程问题:
timeout默认会创建一个新的进程组来运行目标命令。这意味着它主要监控的是直接启动的进程,其子进程(孙进程)可能成为孤儿而继续运行。极短超时:设置非常短(如亚秒级)的超时时间可能因系统调度开销而不够精确-6。
2038年问题:在某些平台上,不支持设置超过2038年的超时时间。
查看完整手册:在终端中,可以使用
info coreutils 'timeout invocation'命令查看更完整的官方文档。