timeout命令是Linux中控制单条命令执行时长最常用、最可靠的方式,专为设定硬性截止时间设计,支持s/m/h单位,默认发SIGTERM,超时返回退出码124。

直接用 timeout 命令,90% 的场景够用;其他方式只在特定限制下才需要介入。
用 timeout 控制单条命令执行时长
这是最常用、最可靠的方式。它专为「运行一个命令 + 设定硬性截止时间」设计,不依赖 shell 环境,也不影响后续命令。
- 基本用法:
timeout 30s curl -s https://example.com—— 超过 30 秒就杀掉curl进程 - 单位支持
s(秒)、m(分)、h(小时),如timeout 2m ping -c 10 google.com - 默认发
SIGTERM,若进程不响应,5 秒后自动补SIGKILL;想跳过等待直接强杀,加-k:timeout -k 1s 5s some_slow_command - 注意:
timeout只管最外层命令,对管道(|)或子 shell($(...))里的命令不生效。例如timeout 5s sh -c 'sleep 10 | echo done'不会提前终止sleep
为什么不用 ulimit -t 替代 timeout
ulimit -t 限制的是 CPU 时间(即进程占用 CPU 的总秒数),不是 wall-clock 时间(现实经过的时间)。这对 I/O 等待多的命令几乎无效。
- 比如
ulimit -t 5; dd if=/dev/zero of=/tmp/test bs=1M count=1000—— 如果磁盘慢,实际耗时几十秒,但 CPU 时间可能不到 1 秒,ulimit完全不会中断它 -
ulimit -t还会污染当前 shell 环境,后续所有命令都受限制,除非显式重置 - 它无法指定信号类型,也不能返回标准的超时退出码(
timeout超时时固定返回124)
给整个终端会话设空闲超时(TMOUT)
这和「命令执行超时」是两回事:它针对的是用户无操作的空闲时间,不是某条命令跑太久。
- 临时设置:
export TMOUT=600(10 分钟无输入自动登出) - 永久生效:写入
/etc/profile或用户级~/.bashrc,但必须加上readonly TMOUT防止被覆盖 - SSH 登录超时由
/etc/ssh/sshd_config控制,靠ClientAliveInterval和ClientAliveCountMax组合实现,和本地终端无关 -
TMOUT对非交互式脚本(如bash script.sh)无效,只作用于登录 shell
sudo 密码缓存超时是独立配置项
别混淆:这不是命令执行超时,而是「输入一次密码后,多久内再用 sudo 不用重新输」的时间窗口。
- 修改
/etc/sudoers(务必用sudo visudo) - 添加或修改这一行:
Defaults timestamp_timeout=5—— 表示 5 分钟后再次sudo就要重输密码 - 设为
0表示每次都要输;设为-1表示永不过期(不推荐) - 该设置不影响命令本身是否超时,只影响权限认证环节
真正难处理的其实是复合命令或后台任务——比如带管道、循环、子进程派生的脚本。这时候 timeout 失效,得靠 kill + wait + trap 手动管理进程组,稍不留神就会漏杀或误杀。这类逻辑一旦写错,比超时本身更容易引发问题。


















