在日常开发、自动化部署或工作流编排工具(比如 Jenkins、n8n、GitLab CI)中,我们经常遇到这种情况:
- 某条命令执行时间太久卡住了;
- SSH 远程执行长时间无响应;
- 脚本执行失败,但流程还在“死撑”;
- 明明只是个 curl 请求,却卡到天荒地老…
这些都可能导致任务失败、系统阻塞甚至资源耗尽。这时,我们就需要一根“保险丝”来保护流程,这就是——
timeout:一个 Linux 中被严重低估的神器!
⸻
一、timeout 是什么?
timeout 是 Linux 提供的一个命令行工具,用于限制其他命令的最长运行时间。
语法如下:
timeout [参数] 时长 命令 [命令参数]
通俗点说,它的作用是:
“我让你跑 10 秒,10 秒内不结束我就强制杀掉你。”
二、实战案例
- 限制 ping 命令运行时间
timeout 5s ping www.baidu.com
这条命令会执行 ping,但 5 秒后无论如何都会被终止。
- SSH 执行远程命令防卡死
timeout 10s ssh user@remote-host "bash /home/user/sync.sh"
SSH 网络不稳定或命令阻塞?加上 timeout,流程照样稳。
- curl 请求加保险
timeout 3s curl http://slow.api.com/data
API 再慢我也只等 3 秒,后面交给异常处理。
- n8n、Jenkins、GitLab 中执行脚本
timeout 60s ./deploy.sh
不管你部署的是 K8s、Docker 还是别的服务,超过 1 分钟就终止,避免整条流水线 hang 死。
三、timeout 参数详解
参数 | 说明 |
---|---|
-s 或 --signal | 发送信号类型(默认是 SIGTERM) |
–preserve-status | 保留被执行命令的退出码 |
–foreground | 允许命令前台运行,适合和交互式命令配合 |
–kill-after=5s | 给命令一个缓冲期,超时后先 SIGTERM,再 SIGKILL |
示例:
timeout --kill-after=3s 10s ./long-running-task
这表示任务运行超 10 秒后,先发 SIGTERM,3 秒后还没退出就 SIGKILL。
四、如何判断 timeout 是否触发?
你可以通过返回值判断:
退出码 | 含义 |
---|---|
124 | 命令被 timeout 终止(超时) |
137 | 命令被强制 kill(SIGKILL) |
其他 | 命令本身的退出码 |
示例:
if timeout 5s ./script.sh; then
echo "执行成功"
else
echo "执行超时或出错"
fi
五、总结
- timeout 是最简单、最直接、最轻量的命令超时控制工具;
- 可用于 Linux 命令、脚本、SSH、API 调用等各种场景;
- 在自动化工作流、CI/CD、监控告警系统中非常实用;
- 配合 --kill-after 能实现更温和的终止机制。
一句话总结:你不一定天天用 timeout,但你一定希望关键任务里它在那里。