容器巡检脚本调 timeout 30 nc -z db 5432,镜像基于 alpine 精简版,报 timeout: not found,脚本没有检查这行,后面在 nc 上一直等,卡了 6 小时。第一次遇到会往复杂处想,其实漏掉的多是个小前提。

command -v timeout >/dev/null || { echo 'timeout missing'; exit 1; }
timeout 30 nc -z -w 5 db 5432

精简镜像里 coreutils 被裁掉,timeout 不在 PATH 里。命令找不到时脚本只是打了一行错误,继续执行到阻塞调用。这一点先确认清楚,后面就不用反复试。

「timeout 命令缺失」这类改动最怕改一半,回滚脚本先准备好,再动生产。把这次用到的命令存进笔记,比记住结论有用,换个环境还能照着走。

改完隔一天再看一次,当场正常不代表能稳住。测试环境和线上的差别,往往就在版本号和那几行被忽略的配置上。

线上出问题先对时间点,跟发布、备份、任务执行的时刻排一排,能省掉一半功夫。

具体做法是,确认镜像里有没有 timeout 没有就装 coreutils 或用 busybox 版本;命令前加 command -v 判断 缺失直接退出;给 nc 自己加 -w 超时参数;在同样镜像里跑一次完整脚本 确认最长耗时可控。

改完照着核一遍,数据库不可达时脚本 30 秒内退出,不会长时间挂住。

作者 9823189