timeout命令是最直接可靠的超时控制方式,专为限制脚本运行时间设计,支持SIGTERM/SIGKILL两级终止、退出码判断及无缝集成cron等调度器。

用 timeout 命令是最直接、最可靠的方式。它专为这类场景设计,无需改脚本逻辑,也不依赖环境变量或 shell 特性。
直接用 timeout 包裹脚本
在调用脚本时加一层超时控制,例如限制最多运行 10 分钟:
timeout 10m ./backup.sh- 若脚本 10 分钟内完成,
timeout静默退出,返回值与脚本一致 - 若超时,
timeout发送SIGTERM终止进程;默认退出码是124
处理超时后的逻辑分支
脚本调用后检查退出码,区分正常结束和超时失败:
timeout 5m ./fetch-data.shif [ $? -eq 124 ]; then echo "任务超时,触发告警"; exit 1; fi- 注意:不要用
-eq 0判断成功,因为脚本本身也可能返回非零但合法的错误码(如 1 表示无新数据)
需要更强终止力时加 kill-after
有些脚本会忽略 SIGTERM(比如正在做磁盘写入或等待锁),这时可追加强制杀招:
timeout --kill-after=30s 5m ./process-heavy.sh- 含义:先给 5 分钟运行时间,超时后发
SIGTERM;若 30 秒内仍未退出,再发SIGKILL - 避免进程变成僵死状态,也防止子进程残留
集成进定时任务或 systemd 服务
不是所有调度器都支持原生超时,但 timeout 可无缝嵌入:
-
cron 中写:
0 */2 * * * timeout 1h /opt/scripts/daily-sync.sh >> /var/log/sync.log 2>&1 -
systemd service 中推荐用原生方式:
LimitCPU=3600或RuntimeMaxSec=3600,比外挂timeout更干净 - 但若用 cron 且需兼容老系统,
timeout仍是首选


















