Linux timeout 命令完全指南指定固定时间并发送固定信号日常运维中我们经常需要运行一些可能“卡住”的命令——压测脚本、爬虫、抓包工具、长任务进程。它们平时运行正常但偶尔会因为网络抖动、死锁、等待输入等原因一直不退出把终端或后台任务死死占住。这时候timeout命令就是最省心的“保险丝”。一、timeout 能做什么timeout是 GNU coreutils 自带的一个命令作用是运行一个命令若它在指定时间内没有结束就向它发送一个信号强制或优雅地把它终止。它解决的核心痛点是命令卡死时能自动超时退出不用人工 CtrlC可以灵活指定“超时多久”、“到时发什么信号”避免长任务无限期占用系统资源二、基本语法timeout[选项]持续时间 命令[参数...]其中“持续时间”就是超时阈值后面的命令 参数是真正要执行的内容。三、指定固定时间时间可以直接写数字也可以带后缀。默认单位是秒后缀s表示秒、m表示分钟、h表示小时、d表示天。# 10 秒不带后缀默认秒timeout10mycmd# 显式写 10 秒更清晰timeout10s mycmd# 5 分钟timeout5m mycmd# 2 小时timeout2h mycmd小提示timeout 10和timeout 10s是等价的。为了可读性建议显式加上单位后缀。四、指定固定信号到点之后timeout默认发送SIGTERM信号 15。我们可以用-s/--signal指定到底发送哪种信号# 到时发送 SIGINTCtrlC 的等效信号2 号timeout--signalINT 10s mycmd# 到时发送 SIGTERM默认15 号timeout--signalTERM10s mycmd# 到时直接 SIGKILL9 号无法被捕获立即强杀timeout-sKILL 10s mycmd信号既可以写名称INT、TERM、KILL也可以写数字2、15、9。常见的信号选择逻辑信号数字行为适用场景SIGTERM15优雅终止进程可捕获并清理默认选择多数场景SIGINT2相当于手动 CtrlC希望模拟用户中断SIGKILL9立即强杀无法被捕获兜底进程彻底不响应时五、完整示例深度解读你可能会在实际脚本里看到这样一条命令timeout--signalINT --kill-after10s 10s\ngauge /root/ngauge-test-20260929/config.yml我们来拆解它的每一部分含义timeout超时控制命令--signalINT到点时发送SIGINT信号让 ngauge 优雅地收尾--kill-after10s发送 SIGINT 之后再给10 秒缓冲时间10s总共运行10 秒到时触发超时ngauge /root/ngauge-test-20260929/config.yml实际要运行的命令及其参数执行的完整时间线启动 ngauge加载config.yml开始压测运行 10 秒后timeout向 ngauge 发送 SIGINT通知它“该停了自己清理”此时 ngauge 有机会保存数据、关闭连接、释放资源不会立即被杀掉如果 ngauge 在 10 秒的缓冲期内正常退出流程就顺利结束如果 ngauge 收到 SIGINT 后 10 秒内仍然不死--kill-after触发发送SIGKILL强制杀死一句话总结这是非常经典的“先优雅后强制”的停止策略——给进程一次体面退出的机会实在不行再动刀。六、为什么这样设计很有用很多服务类工具收到 SIGINT 后会做资源清理比如压测工具要关闭网络连接、抓包工具要落盘保存数据、数据库客户端要提交事务。如果一上来就发 SIGKILL这些数据可能直接丢失或损坏。而--kill-after正好弥补了“发了优雅信号但进程仍卡死”的漏洞保证一定能在某个时间点杀掉进程不会无限期挂住。这对脚本、CI、定时任务里的防挂死处理特别有价值。七、其他常用选项timeout还有几个实用的参数# 超时后保留命令的退出码方便脚本判断失败原因timeout--preserve-status 10s mycmd# 在前台模式下运行配合管道使用避免无法获取子进程输出timeout--foreground10s cmd|teelog.txt# 把超时时长作为第一个参数传给命令少见但存在timeout--timeout10s mycmd--preserve-status超时杀掉命令后返回 127 还是命令实际退出码由它决定用于脚本精确判断“是超时了还是真出错了”。--foreground当 timeout 和管道、后台作业一起用无法往子进程发信号时使用。八、总结timeout是一个小而美的命令核心要素只有两个时间告诉它“多久算超时”信号告诉它“超时后怎么处理”再配合--kill-after就能实现“给机会、不无限等”的优雅停止策略。下次再写压测、抓包或长任务脚本别忘了给它上一道timeout保险丝。