补充说明
timeout 是 GNU coreutils 提供的看门狗式包装命令:启动指定程序,若它在给定时限内没有退出,就向它发送信号(默认 TERM)将其结束。常用于避免脚本被卡死的网络请求、交互式程序或死循环拖住。
时间单位可以带后缀:s 秒(默认)、m 分、h 小时、d 天,也接受小数如 0.5s。程序被超时杀死时,timeout 自身返回 124;若程序自己以其他状态退出,则原样返回该状态。
仅发送 TERM 时,进程可能捕获信号后继续运行,所以常配合 -k 设置“宽限期”:先 TERM,过若干秒仍未退出就 KILL。--preserve-status 让 timeout 返回子进程的真实退出码,而不是 124,适合在脚本中区分“超时”和“程序失败”。
语法
timeout [选项] 时长 命令 [参数...]
选项
-s, --signal 信号:指定超时后发送的信号,默认TERM-k, --kill-after 时长:宽限期后再发KILL--preserve-status:返回子进程的真实退出状态--foreground:在前台运行,便于交互式程序接收终端信号-v, --verbose:超时时打印提示信息--help、--version:帮助与版本信息
实例
# 最多运行 5 秒
timeout 5s sleep 10
# 30 秒后发送 INT,模拟 Ctrl+C
timeout -s INT 30 ping example.com
# 先 TERM,10 秒后仍未退出则 KILL
timeout -k 10 60 ./long-task.sh
# 保留程序自身的退出码
timeout --preserve-status 10 curl -s https://example.com
# 在脚本中判断是否超时(退出码 124)
if ! timeout 3 ping -c1 host; then echo "超时或失败"; fi