timeout 命令详解
更新时间:2026-08-28。本文是「一个命令一个文档」系列,属于 Shell 内建命令族(见Shell 内建命令)。防止某个命令卡死把脚本挂住。
timeout 在指定时长内运行一条命令,时间到了还没结束就把它杀掉。写脚本调用可能卡住的网络/外部命令时,它是保险丝。
一、基本用法
bash
timeout 10 curl http://slow.site # 10 秒没响应就终止 curl
timeout 5s ./maybe_hang # 支持 s/m/h 后缀语法
timeout 时长 命令。时长默认秒,可加s/m/h/d。命令在时限内正常结束,timeout 返回该命令的退出码;超时被杀则返回 124。
二、发送的信号:-s / -k
bash
timeout -s INT 5 cmd # 超时发 SIGINT(优雅中断)
timeout -k 5 10 cmd # 先 SIGTERM,10 秒后还没死再 SIGKILL(再等5秒)默认发
SIGTERM(15),程序可捕获做清理;程序不理睬时用-s KILL强制。-k DURATION(kill-after)更狠:先给 SIGTERM,额外等 DURATION 还活着就 SIGKILL,确保一定杀掉。
三、与 sleep 的区别
bash
sleep 5 # 自己睡 5 秒(见 [sleep](/linux/cmd/sleep.md))
timeout 5 long_cmd # 限制别的命令最多跑 5 秒sleep 是"我自己暂停",
timeout是"给别的命令上闹钟"。要限制某命令时长用 timeout,单纯等待用 sleep。
四、实战:脚本防卡死
bash
if ! timeout 30 rsync -a src/ dst/; then
echo "rsync 超时或失败"
fi外部命令(网络、备份)可能无限挂起,套
timeout让脚本能继续往下走而不是永远卡住。配合--preserve-status可保留原命令退出码。
一句话总结
timeout = 给命令上闹钟:timeout 10 cmd 超时就杀(返回 124);-s 指定信号(默认 SIGTERM,程序可捕获清理)、-k 先 SIGTERM 再 SIGKILL 确保杀掉;脚本里套外部/网络命令防卡死挂起;区别于 sleep(自己睡,见sleep)。