进程与作业69 条

sleep 延时控制

脚本节流与等待:sleep 0.5 支持小数、2m/1h 带单位、infinity 永久;等待服务就绪时尽量用循环探测替代死等。

Linux 运维命令速查系统更新于 2026-10-13

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 写在条件判断或 && 链条中更安全,被信号打断返回非零时不会直接终止整个流程。

易错点

  • 写死 sleep 30 等服务启动:机器慢则失败、机器快则白等,应改为循环探测并设置最大次数
  • sleep 的单位写错(例如把毫秒当秒)会让脚本慢得莫名其妙,跨平台时老实现还不支持小数
  • 在 set -e 脚本里把 sleep 放进行条件判断位置,被信号中断返回非零会意外终止流程
  • 用 sleep 做互斥或代替定时任务不可靠:到点触发应交给 cron 或 systemd timer

数据来源与参考

  • man 1 sleep(GNU coreutils 手册)

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌