)
Linux命令-sleep暂停指定时间 简介 语法⚙️ 选项 实战示例示例 1基本用法示例 2定时循环最经典示例 3等待资源就绪启动顺序控制示例 4限速/节流示例 5进度条与动画示例 6脚本间协调示例 7sleep 的精度与系统调用示例 8sleep 高级用法与坑⚠️ 注意事项 总结 相关命令快速参考sleep是最简单的 Linux 命令之一暂停当前进程指定时间。支持秒默认/分/时/天/浮点数是定时循环、节流、等待资源就绪、限速、优雅退出等场景的必备工具。sleep 1; echo done是 99% 教程的开篇示例。 简介项目说明命令全称sleep休眠所属包coreutils实现nanosleep / usleep 系统调用精度亚秒级受进程调度影响输入一个或多个数字带后缀后缀s/m/h/d信号处理SIGHUP/SIGTERM默认立即唤醒取决于实现进程替代sleep infinity无超时慎用sleepvswaitvsusleepvsat对比命令用途单位sleep暂停当前进程秒/分/时/天wait PID等待后台子进程退出-usleep暂停微秒已废弃微秒at HH:MM在指定时刻执行命令-cron周期性任务-timeout 5 cmd限制命令执行时间秒read -t 5读输入超时秒 语法sleep数字[后缀][数字[后缀]]...sleepinfinity# 永久睡眠新版 coreutils8.32支持多个参数求和sleep 2m 30s 150 秒2 分 30 秒sleep 1d 2h 30m 5s 1 天 2 时 30 分 5 秒⚙️ 选项选项简写说明--help-h帮助--version-Vcoreutils 版本(无)无功能选项——就是个超简命令无-s-m选项后缀s/m/h/d是参数后缀而非选项。 实战示例示例 1基本用法# 1. 默认单位是秒$sleep5;echo5 秒后5秒后# 2. 等 2 秒$sleep2echodone after 2sdoneafter 2s# 3. 浮点数$sleep0.5;echo0.5 秒0.5秒# 高精度亚秒级# 4. 不同单位$sleep30s# 30 秒$sleep5m# 5 分钟$sleep2h# 2 小时$sleep1d# 1 天# 5. 多个参数GNU coreutils 8.32$sleep1m 30s# 90 秒$sleep1h 30m# 1.5 小时$sleep0.50.5# 1 秒示例 2定时循环最经典# 1. 每 5 秒检查一次服务 $whiletrue;docurl-s-o/dev/null-w%{http_code}\nhttp://localhost:8080/healthsleep5done200200404200...# 2. 每 10 秒清理一次临时文件 $whiletrue;dofind/tmp-typef-mmin10-delete2/dev/nullsleep10done# 3. 心跳上报 $whiletrue;docurl-XPOST-dalive$(date%s)http://monitor.example.com/heartbeatsleep60done# 4. 简单 watch $whiletrue;docleardateuptimesleep2done# 每 2 秒刷新# 实际有 watch 命令但 sleep clear 也能用# 5. 重试机制指数退避 $cat/opt/scripts/retry.sh#!/bin/bashattempt1max5delay2while[$attempt-le$max];doifcurl-sfhttp://api.example.com/dev/null;thenechoSuccess on attempt$attemptexit0fiechoAttempt$attemptfailed, waiting${delay}s...sleep$delaydelay$((delay*2))# 指数退避2, 4, 8, 16attempt$((attempt1))doneechoAll attempts failedexit1示例 3等待资源就绪启动顺序控制# 1. 等待 MySQL 就绪后再启动应用 $cat/opt/scripts/wait-for-mysql.sh#!/bin/bashHOST${1:-mysql}MAX_WAIT60echo等待 MySQL 就绪...foriin$(seq1$MAX_WAIT);doifmysqladminping-h$HOST--silent2/dev/null;thenechoMySQL 已就绪用了$i秒exit0fisleep1doneechoMySQL 启动超时${MAX_WAIT}秒exit1# 2. 等待端口可用 $cat/opt/scripts/wait-port.sh#!/bin/bashHOST${1:-localhost}PORT${2:-8080}MAX_WAIT30foriin$(seq1$MAX_WAIT);doif(echo/dev/tcp/$HOST/$PORT)2/dev/null;thenecho端口$PORT已就绪exit0fisleep1doneecho端口$PORT等待超时exit1# 3. 等待文件出现 $cat/opt/scripts/wait-file.sh#!/bin/bashFILE$1MAX_WAIT30foriin$(seq1$MAX_WAIT);doif[-f$FILE];thenecho文件已就绪:$FILEexit0fisleep1doneecho文件未出现:$FILEexit1示例 4限速/节流# 1. 限制脚本调用频率 $cat/opt/scripts/limited.sh#!/bin/bash# 防止外部每分钟调用超过 10 次MIN_INTERVAL6# 60/106 秒/次LOCKFILE/tmp/limited.lock# 用 lockfile mtime 检查now$(date%s)if[-f$LOCKFILE];thenlast$(stat-c%Y$LOCKFILE2/dev/null||echo0)diff$((now-last))if[$diff-lt$MIN_INTERVAL];thenecho调用过于频繁需等$((MIN_INTERVAL-diff))秒exit1fifitouch$LOCKFILE# 业务逻辑echo执行任务...sleep$((MIN_INTERVAL-1))# 让下次至少要等这么久# 2. 限速文件下载每秒一个 $cat/opt/scripts/limited_download.sh#!/bin/bashURLS(http://a.com/1http://a.com/2http://a.com/3http://a.com/4)forurlin${URLS[]};docurl-sO$urlsleep1# 避免打爆对方done# 3. 限速重试避免雪崩 $cat/opt/scripts/bulk_with_pause.sh#!/bin/bashitems(item1 item2 item3... item100)foritemin${items[]};doprocess$itemsleep0.5# 每次间隔 0.5 秒done示例 5进度条与动画# 1. 简单进度条 $cat/opt/scripts/progress.sh#!/bin/bashTOTAL20foriin$(seq1$TOTAL);dopercent$((i*100/TOTAL))bar$(printf%-$((i *2))s | tr #) printf \r[%20s]%d%% $bar $percent sleep 0.5 done echo echo 完成 # 输出 # [####################] 100% # 完成 # 2. 旋转动画 $ cat /opt/scripts/spinner.sh #!/bin/bash spinner(| / - \) i0 while true; do i$(((i1)%4))printf \r%c 处理中... ${spinner[$i]}sleep0.1done# CtrlC 退出示例 6脚本间协调# 1. master-slave 协调 $cat/opt/scripts/master.sh#!/bin/bash# 启动 worker然后等待/opt/scripts/worker.shWORKER_PID$!echoWorker PID:$WORKER_PID# 给 worker 时间启动sleep5# 检查 worker 状态ifkill-0$WORKER_PID2/dev/null;thenechoWorker 仍在运行elseechoWorker 已退出fi# 等待 worker 完成wait$WORKER_PIDechoWorker 完成# 2. 并发限流semaphore 模式 $cat/opt/scripts/limited_concurrent.sh#!/bin/bashMAX5items(item1 item2... item20)foritemin${items[]};do# 限制并发while[$(jobs-r|wc-l)-ge$MAX];dosleep0.5doneprocess$itemdonewait# 3. 优雅停止trap $cat/opt/scripts/graceful.sh#!/bin/bashrunningtruecleanup(){echo正在停止...runningfalse}trapcleanup INTTERMwhile$running;doecho工作中...$(date)sleep2doneecho已停止示例 7sleep 的精度与系统调用# 1. 精度测试 $timesleep1real 0m1.001s# 实际比 1 秒略长系统调度$timesleep0.001real 0m0.001s# 1ms 精度# 2. 浮点精度 $timesleep0.0001real 0m0.000s# 100 微秒是内核时钟精度# 3. 与 usleep 对比已废弃 # usleep 仅支持微秒# 在新 glibc 已弃用$ usleep100000# 100ms# 仍可用但 POSIX 已不推荐# 用 sleep 0.1 替代# 4. 底层调用 $strace-etracenanosleep,clock_nanosleepsleep0.5nanosleep({tv_sec0,tv_nsec500000000}, NULL)0 exited with0# 5. 与 signal 的关系 $cat/tmp/sig_test.sh#!/bin/bashechoPID:$$echo等待 10 秒CtrlC 唤醒...sleep10echo正常完成$bash/tmp/sig_test.sh PID:12345等待10秒CtrlC 唤醒... ^C# sleep 收到 SIGINT 立即唤醒# 验证trap 默认行为$cat/tmp/sig_trap.sh#!/bin/bashtrapecho 收到 SIGINT; exitINTsleep10echo正常完成# CtrlC 触发 trap 并退出示例 8sleep 高级用法与坑# 1. sleep infinity 与进程管理 # 启动长时间等待$sleepinfinity$jobs[1] Runningsleepinfinity# 用 kill 唤醒$kill%1# 立即退出无报错# 用法临时阻塞$sleep3600# 等 1 小时可被 kill# 等价$tail-f/dev/null# 永久阻塞必须 CtrlC# 2. sleep 与 cron 的区别 # cron 周期性sleep 单次$cat/etc/cron.d/check_app */5 * * * * /opt/scripts/check.sh# vs$whiletrue;do/opt/scripts/check.sh;sleep300;done# 前者由 cron 管理后者必须自己 run# 3. sleep 与 subshell $(sleep5;echosubshell done)$# 不阻塞当前 shell$# 5 秒后输出# 4. 浮点数边界 $sleep0# 0 秒合法$sleep0.0# 0 秒$sleep-1# 错误必须是正数sleep: invalidtimeinterval ‘-1’ Trysleep --helpformoreinformation.# 5. 大量 sleep 的性能 $cat/tmp/many_sleeps.sh#!/bin/bash# 启动 1000 个 sleep 1 并发foriin$(seq11000);do(sleep1;echodone$i)donewaitecho全部完成$timebash/tmp/many_sleeps.sh/dev/null real 0m1.020s# 1 秒完成1000 个并发 sleep# 6. 与 timeout 的关系 # sleep 自身是等待# timeout 限制其他命令的执行$timeout5sleep10# 5 秒后 SIGTERM 杀 sleep$echo$?124# timeout 退出码# 7. sleep 的退出码 $sleep5;echo$?0# 浮点/非法$sleepabc sleep: invalidtimeinterval ‘abc’ Trysleep --helpformoreinformation. $echo$?1⚠️ 注意事项1. 默认单位是秒sleep 5 5 秒不是5 毫秒。想要毫秒sleep 0.0055 毫秒浮点2. 精度受系统调度影响物理睡眠 1 秒实际可能 1.001-1.05 秒浮点 0.1 秒实际 0.1-0.5 秒浮点 0.0001 秒可能直接被截断高精度场景用nanosleepC API3. 多个参数求和是 GNU 扩展sleep 2m 30s 150 秒GNU coreutils 8.32BSD / macOS / 旧 Linux只取第一个参数30s报错可移植脚本用sleep 150替代4. 信号处理sleep默认响应信号立即唤醒。实际SIGINTCtrlC→ 立即结束SIGTERM → 立即结束等待中kill -0→ 不影响 sleeptrap会先执行再 sleep 退出5. sleep infinity 的风险进程不退出PID 占着必须kill才能唤醒容器/Pod 中容易泄漏进程生产环境慎用写明时长6. 内存/CPU 占用sleep是阻塞syscall不占 CPU。vmstat的us/sy列不会因 sleep 增加。ps显示S状态SLEEPING可中断。7. 与usleep的关系usleep已被 GLIBC 标记为deprecated。新代码sleep 0.0000011 微秒或 C 代码用nanosleep()。8. 浮点小数点必须是.sleep 0,5错误欧洲小数点sleep 0.5正确。9. 后缀 s/m/h/d 大小写敏感sleep 5S报错GNU 不支持大写sleep 5s正确。实际测试coreutils 接受大小写混合。10. 实时性 vs sleep 精度短 sleep 1 秒相对精度高长 sleep 1 分钟受系统时钟影响夏令时、NTP 调整等金融/工业实时用专用 RTOS 或clock_nanosleep绝对时间11. cron 中的 sleep# crontab 中 sleep 配合命令* * * * *sleep30;/opt/scripts/half_minute_job.sh# 30 秒后跑任务变相每分钟第 30 秒12. wait vs sleepsleep5# 5 秒后继续**无依赖**wait$PID# 等待某进程退出**有依赖**wait# 等待**所有**子进程**有依赖** 总结sleep是 shell 脚本的心跳节拍器——简单但无处不在。本节要点基本sleep N秒、sleep 0.5浮点、sleep 5m分钟核心场景定时循环while sleep 5; do ...; done等待资源就绪端口、文件、服务限速/节流每秒 1 个请求优雅停止trap sleepGNU 扩展sleep 2m 30s多个参数求和精要选择等待子进程 →wait暂停当前进程 →sleep限制命令时长 →timeout周期性任务 →cron指定时刻 →at最终建议通用等待sleep N毫秒级sleep 0.N跨平台sleep N一个参数进程间协调wait $PID超时控制timeout 30 cmd。 相关命令命令用途sleep暂停指定时间本节wait等待子进程退出usleep暂停微秒已废弃timeout限制命令执行时间at HH:MM定时单次执行cron/crontab周期性执行read -t N读输入超时trap信号处理nanosleep()C 系统调用高精度date时间/日期usleep/clock_nanosleep库函数bash -c在子 shell 执行nohup免疫 HUP 信号disown解除 job 关系