TMOUT配置不生效的主因是未满足三个硬条件:必须为整数、全局export声明、且shell启动时已存在;仅写TMOUT=600无效,须用export TMOUT=600,并确保未被~/.bashrc等覆盖或SSH保活机制抢先断连。

TMOU 配置不生效,八成是没导出、没在正确位置写、或者被覆盖了——它不是“设了就自动管用”的变量,必须满足三个硬条件:整数、全局 export、shell 启动时已存在。
TMOUT 必须用 export 声明,且只能是整数
只写 TMOUT=600 不起作用,bash 会把它当普通变量;必须写成 export TMOUT=600。值也不能是小数或带单位(比如 TMOUT=10m 或 TMOUT=600.0),否则 shell 直接忽略该变量,echo $TMOUT 会输出空。
- 生效检查:登录后执行
echo $TMOUT,应返回数字(如600);若为空,说明未加载或被覆盖 - 只读加固(可选):
export TMOUT=600; readonly TMOUT,能防用户执行unset TMOUT或TMOUT=0 - 注意拼写:变量名是
TMOUT,不是TIMEOUT、tmout或TMOU,大小写敏感且无下划线
/etc/profile 和 ~/.bashrc 的加载顺序决定谁赢
系统级配置写在 /etc/profile,用户级写在 ~/.bashrc,但后者常会覆盖前者——尤其当 ~/.bashrc 里有 unset TMOUT 或 TMOUT=0 时,系统设置就白配了。
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
- 推荐做法:统一在
/etc/profile设置,并在末尾加一行readonly TMOUT,避免被用户文件绕过 - 如果必须按用户定制,检查其
~/.bashrc是否含source /etc/profile;若无,需手动补上,否则系统设置不继承 - 图形终端(GNOME Terminal、Konsole)默认启动非登录 shell,
/etc/profile不加载,此时要改/etc/bash.bashrc(Debian/Ubuntu)或确保终端设为“运行命令作为登录 shell”
SSH 连接不退出?不是 TMOUT 失效,而是 ClientAlive 先断了
SSH 客户端保活(如 PuTTY 的 “Seconds between keepalives”)或服务端 ClientAliveInterval 设置太激进,会导致连接在 shell 检测到空闲前就被 SSH 层强制断开——这时你看不到 TMOUT 生效,其实是根本没轮到它触发。
- 协同配置原则:让 SSH 层断连时间 > TMOUT 时间,例如设
TMOUT=600(10 分钟),则ClientAliveInterval 400+ClientAliveCountMax 2(即最多空闲 800 秒) - 验证方式:SSH 登录后执行
sleep 610,若 610 秒后才断,说明是 TMOUT 在起作用;若 5 分钟左右就断,大概率是ClientAliveInterval在干预 - 后台命令干扰:运行
watch -n 1 date或tail -f /var/log/syslog会让 TMOUT 计时器不断重置,因为每次输出都算一次“活动”
别指望 TMOUT 管所有场景,关键任务得换方案
TMOUT 只对交互式 shell 有效,对脚本、sudo -i 新 shell、tmux、screen 会话基本无效——这些环境要么不继承变量,要么自己重置空闲计时器。
- 自动化脚本中禁用
TMOUT:脚本开头加unset TMOUT,否则read卡住或ssh等待响应时可能意外退出 - 长期运维任务:用
timeout 3600s ssh user@host 'long-task.sh'替代裸ssh,精准控制单次连接生命周期 - 强管控需求:配合 PAM
pam_time.so在/etc/security/time.conf中设*;Al0000-2400;MinIdle=600;,比 shell 变量更底层、更难绕过
真正容易被忽略的点是:TMOUT 对 root 用户也生效,但如果你用 sudo -i 切换,新 shell 默认不继承环境变量(受 env_reset 控制),得确认 Defaults env_keep += "TMOUT" 是否写进了 /etc/sudoers。

















