sleep 能做什么
sleep 是 shell 脚本里最常用的延时工具,把当前进程挂起指定时长后返回。GNU 版本支持小数秒与带单位写法(s、m、h、d),还可以一次给多个参数表示求和。它既用于节流(控制请求速率、避免压垮目标系统),也用于简单等待,但等待服务就绪时更应该用循环探测而不是写死时长。
基本信息
| 适用平台 | Linux(GNU coreutils)、macOS;Windows 下对应 timeout 命令 |
|---|---|
| 语法 | sleep 时长 [时长...],多个参数自动相加 |
| 单位支持 | s 秒、m 分、h 时、d 天,缺省为秒;GNU 支持小数 |
| 特殊取值 | infinity 表示永久挂起 |
典型使用场景
- 批量脚本中每次循环休眠零点几秒,降低对目标系统的冲击
- 等待本机服务端口就绪后再继续执行后续步骤
- 重试之间做退避等待,避免高频重试放大故障
- 给滚动发布留出观察窗口,间隔一段时间再检查下一个批次
- 在演示或测试脚本里控制输出节奏
常用示例
常用示例
sleep 0.5 # 半秒,节流循环常用
sleep 2m # 2 分钟
sleep 1h 30m # 多参数相加,共 1 小时 30 分
sleep infinity & # 永久挂起(常与容器占位配合)
timeout 5 sleep 30; echo $? # 被 timeout 截断,返回 124
for i in $(seq 1 30); do nc -z 127.0.0.1 8080 && break; sleep 1; done # 等端口就绪,最多 30 秒
sleep 10 && echo done # 用例式写法,串在命令链里写法逐例读法
| 写法 | 含义 | 注意 |
|---|---|---|
| sleep 5 | 休眠 5 秒 | 不写单位时按秒处理 |
| sleep 0.2 | 休眠 200 毫秒 | 老实现可能不支持小数 |
| sleep 2m | 休眠 2 分钟 | 字母单位是 GNU 扩展 |
| sleep 1 2 3 | 共休眠 6 秒 | 多参数求和,容易与循环里的写法混淆 |
| 循环探测 + sleep | 条件满足即继续 | 优于死等固定时长 |
节流场景建议 sleep 0.1 到 0.5 秒之间:对目标系统压力下降明显,而整体耗时增加有限。
sleep 被信号中断会提前返回并带上非零退出码,脚本不要假设一定睡满整段时间。
等待服务的推荐写法
- 用循环加条件探测,例如检查端口、健康接口返回码或日志关键字,命中即跳出
- 设置最大尝试次数并给出超时退出,避免无限等下去
- 每次探测间隔 1 秒左右,既及时又不制造额外压力
- 探测失败时打印最后一次尝试的原始输出,否则排障时看不出是被拒还是超时
- 等待数据库场景改用现成工具(pg_isready 一类)比手写端口探测更准
在 set -e 的脚本里,sleep 写在条件判断或 && 链条中更安全,被信号打断返回非零时不会直接终止整个流程。