Shell Daily 2026-01-21: 自动熔断 (Timeout)
Shell Daily 2026-01-21: 自动熔断 (Timeout)
在编写自动化脚本或维护 CI/CD 流水线时,最令人头疼的往往不是“报错”,而是“假死”。
curl 请求一直没有响应、数据库迁移卡在锁表、或者某个子进程挂起导致整个备份脚本跑了 20 个小时还没结束。遇到这种情况,我们通常只能手动 ps 找进程然后杀掉,非常被动。
GNU Coreutils 提供了一个防御性极强的工具:timeout,它能给任何命令装上“定时炸弹”,强制其在规定时间内结束。
怎么用
你不需要修改原来的命令,只需把它作为参数传给 timeout。
- 语法:
timeout [时长] [原有命令] - 返回值:如果任务超时被杀,返回状态码 124;否则返回原命令的状态码。
- 兼容性:Linux (GNU coreutils) 标配。macOS 需安装 coreutils (
gtimeout)。
适用场景
- 依赖检查:在脚本中探测外部 API 或数据库端口,避免无限等待。
- 任务限时:限制单次备份或编译任务的最大耗时,防止资源耗尽。
示例 1:网络请求兜底
虽然 curl 也有 --max-time 参数,但 timeout 提供的是系统级的通用方案,适用于所有命令(如 ping, nc 等)。
# 尝试连接数据库端口,超过 3 秒强制退出
# 避免脚本卡死在这一步
if ! timeout 3s nc -z 192.168.1.50 3306; then
echo "Error: Database connection timed out."
exit 1
fi
示例 2:激进的清理策略 (-s)
默认情况下,timeout 发送 TERM 信号(温和停止)。如果遇到“死猪不怕开水烫”的进程,可以指定信号。
# 运行高风险脚本
# -s KILL: 5秒后如果还没停,直接发送 SIGKILL (强制清理)
timeout -s KILL 5s ./risky_migration.sh
(注:养成给自动化脚本加 timeout 的习惯,是很多资深运维告别“半夜被电话叫醒处理僵尸进程”的秘诀。)

浙公网安备 33010602011771号