优先用pam_exec实现用户注销时自动清理:覆盖所有登录方式,脚本需设为#!/bin/sh、避免依赖$HOME、仅清理/tmp/$PAM_USER-*和~/.cache中7天未访问的非关键子目录,并记录日志到/var/log/user-clean.log。

Linux用户注销时自动清理/tmp和$HOME/.cache目录
系统默认不会在用户登出时清空个人临时文件,得靠pam_exec或systemd --user服务主动触发。直接改~/.bash_logout不可靠——图形界面、SSH非交互式退出、崩溃退出都不会执行它。
- 优先用
pam_exec:能覆盖所有登录方式(TTY、X11、Wayland、SSH),只要PAM会话结束就运行 - 脚本必须有可执行权限且路径不含空格或特殊字符,否则
pam_exec静默失败 - 避免清理
/tmp全局目录——普通用户没权限删别人文件,应只清理自己创建的/tmp/user-<code>$(id -u)或/tmp/<code>$USER-* -
$HOME/.cache可以全删,但某些应用(如firefox)可能正在写缓存,建议加sleep 0.5再删,或用rm -rf ~/.cache/*跳过隐藏文件(如.cache/.lock)
用pam_exec在session close阶段执行清理脚本
编辑/etc/pam.d/common-session(Debian/Ubuntu)或/etc/pam.d/system-auth(RHEL/CentOS),在末尾加一行:
session optional pam_exec.so /usr/local/bin/clean-user-temp.sh
注意:optional表示即使脚本失败也不阻断登出;用required会导致登出卡住甚至无法登录——比如脚本里rm权限不对或路径不存在。
- 脚本第一行必须是
#!/bin/sh,不能用#!/usr/bin/env bash——PAM调用时PATH极简,env可能找不到 - 脚本内不能依赖
$HOME环境变量——PAM session close时它常为空,要用getent passwd $PAM_USER | cut -d: -f6获取 - 别用
sudo或su提权:PAM以root身份执行脚本,但$PAM_USER才是当前登出用户,所有操作需明确限定归属
脚本里安全删除缓存的关键判断点
硬删$HOME/.cache容易误伤正在运行的程序,尤其flatpak或electron应用会锁文件。稳妥做法是:只删明显过期的子目录,跳过.cache/fontconfig这类需要长期保留的。
- 用
find ~/.cache -mindepth 1 -maxdepth 1 -type d ! -name "fontconfig" ! -name "abrt" -mtime +7 -exec rm -rf {} +:7天未访问的顶层缓存目录才清理 - 对
/tmp,优先清理/tmp/<code>$PAM_USER-*和/tmp/user-<code>$(id -u),这两个是systemd或login分配的用户专属临时区 - 加
set -e开头让脚本遇到错误立即退出,避免部分失败后继续执行造成混乱 - 日志写到
/var/log/user-clean.log而非/tmp或~/.cache——否则刚删完就写不进去了
图形界面登出时systemd --user的替代方案
如果系统用systemd-logind管理会话(现代发行版默认),更干净的方式是注册一个--user服务,在StopWhenUnneeded=yes下随会话结束自动触发。
- 服务文件放
$HOME/.config/systemd/user/clean-on-logout.service,内容含Type=oneshot和ExecStart=/usr/local/bin/clean-user-temp.sh - 启用它:
systemctl --user enable clean-on-logout.service,再systemctl --user daemon-reload - 缺点:仅适用于systemd用户实例已启动的场景(即用户至少登录过一次图形或SSH并启用了
user@.service),纯console login可能不生效 - 优点:脚本能自然继承
$HOME、$XDG_RUNTIME_DIR等变量,不用手动查用户主目录
真正难搞的是混合环境:有人用SSH,有人用GDM,还有人直接ctrl+alt+f2切tty。这时候pam_exec仍是兜底最稳的选择——只要PAM链跑完,它就一定执行,不挑登录方式。










