TMOUT=600必须写入登录Shell配置文件才生效:bash用户应加到/etc/profile或~/.bash_profile,zsh用户加到~/.zshrc;仅写TMOUT=600无效,须export导出,且需source或新登录验证echo $TMOUT输出600。

TMOUT=600 要写在哪儿才生效
不是随便写进任意配置文件就管用。bash 登录 shell 优先读 /etc/profile 或 ~/.bash_profile,zsh 则认 ~/.zshrc。新手常把 export TMOUT=600 塞进 ~/.bashrc,结果 TTY(Ctrl+Alt+F1~F6)登录时完全不触发——因为那是登录 shell,不加载 .bashrc。
推荐做法:
- 对所有用户统一生效:用 root 编辑
/etc/profile,末尾加export TMOUT=600 - 只对当前用户生效:编辑
~/.bash_profile(bash)或~/.zshrc(zsh),加同一行 - 别漏掉
export:写成TMOUT=600是局部变量,新开终端就失效 - 改完必须
source /etc/profile或新开终端,echo $TMOUT输出600才算成功
SSH 连接为啥设了 TMOUT 还不自动断
因为 SSH 层有自己的保活机制,和 shell 层的 TMOUT 并不耦合。服务端没发心跳,客户端可能早断了;或者网络卡住,shell 还在等输入,TMOUT 根本不计时。
必须同步配 /etc/ssh/sshd_config:
- 取消注释并设为:
ClientAliveInterval 300(每 5 分钟发一次心跳) - 取消注释并设为:
ClientAliveCountMax 2(连续 2 次无响应即断开,合计 10 分钟) - 改完必须执行:
sudo systemctl restart sshd - 验证方式:SSH 登录后不敲任何命令,等 10~12 分钟,看是否提示
Connection closed by remote host
为什么 top/vim/tmux 里等半天也不退出
这是预期行为,不是 bug。TMOUT 只在 shell 等待命令输入时倒计时。一旦你运行 top、vim、less 或进入 tmux 会话,控制权交给了这些程序,bash 暂停计时。
这意味着:
- 不能靠
TMOUT保证“所有场景下 10 分钟必退”,它只管纯 shell 交互态 -
tmux和screen会话默认不继承TMOUT,需单独在会话内设或依赖 SSH 层断连 - 全屏程序期间空闲,实际已脱离 shell 监控范围——这也是为什么高安全场景要配合
systemd-logind的IdleAction=lock
为什么改了却没反应?三个高频失效点
配置写了、也 source 了,但就是不退出。大概率踩中以下其一:
-
sudo -i或su -切换用户后,目标用户的~/.bashrc里有unset TMOUT或TMOUT=0,立刻覆盖系统级设置 - 发行版启用了
systemd-logind,且/etc/systemd/logind.conf中IdleActionSec=300和InhibitDelayMaxSec干预了空闲判断,优先级高于TMOUT -
/etc/profile.d/下某些脚本(如运维工具包自带的)重置了TMOUT,检查是否有类似TMOUT=0的行
真正起效的关键不在“设没设”,而在于整个加载链路里有没有被中途覆盖、接管或忽略——尤其当系统混用 TTY、SSH、GUI 终端和 systemd 时,单一配置很难通吃。


















