mac每日23:00自动关机前,通过pmset调度+logouthook脚本清理系统临时目录、用户缓存及下载文件夹中超24小时的临时文件,确保敏感数据清除且不依赖用户登录。

你想让Mac在每天晚上11点自动关机,同时确保关机前清空系统临时目录(/private/var/folders/)、用户缓存(~/Library/Caches)和下载文件夹中超过24小时的临时文件,避免残留敏感数据或占满磁盘空间——这需要组合系统定时任务与脚本清理逻辑,不能仅靠图形界面完成。
用pmset+Shell脚本实现关机前自动清理
这是唯一能保证清理动作在关机流程启动前执行、且不依赖用户登录状态的方式。系统设置里的“定时关机”无法插入自定义命令,而pmset调度的shutdown会等待脚本退出后再终止进程。
第一步:创建清理脚本并赋予执行权限
打开“终端”,依次执行以下命令:
sudo nano /usr/local/bin/clean-before-shutdown.sh
在nano编辑器中粘贴以下内容(按Ctrl+O保存,Ctrl+X退出):
#!/bin/bash
find /private/var/folders -type f -mtime +1 -delete 2>/dev/null
find ~/Library/Caches -type f -mtime +1 -delete 2>/dev/null
find ~/Downloads -type f -mtime +1 -name "*temp*" -delete 2>/dev/null
find ~/Downloads -type f -mtime +1 -name "*.tmp" -delete 2>/dev/null
执行:sudo chmod +x /usr/local/bin/clean-before-shutdown.sh
第二步:用pmset绑定清理脚本与关机动作
输入命令:sudo pmset repeat shutdown MTWRFSU 23:00:00 → 回车 → 输入密码。
第三步:覆盖默认shutdown行为,注入清理逻辑
执行:sudo defaults write /Library/Preferences/com.apple.loginwindow LogoutHook /usr/local/bin/clean-before-shutdown.sh
LogoutHook会在用户登出(含关机触发的登出)前最后执行一次,且运行在root上下文,能删除受保护的临时文件。【若跳过此步,pmset只会直接关机,不运行任何清理】
用快捷指令+AppleScript实现带通知的清理关机
适合不想碰终端、但需要看到“正在清理临时文件”弹窗的用户。它不修改系统级钩子,所有操作在用户会话内完成,安全性更高,但要求你必须保持登录状态。
方法一:创建清理脚本快捷指令
打开“快捷指令”App → 点击右上角“+” → 命名为“clean & shutdown” → 添加操作 → 搜索“运行脚本” → 选择“Shell” → 粘贴:
rm -rf ~/Library/Caches/*
rm -f ~/Downloads/*.tmp ~/Downloads/*temp*
→ 点击“下一步” → 添加第二个操作 → 搜索“关机” → 选择“关机”动作 → 关闭“运行前询问”。
方法二:设置每日22:55触发自动化
切换到“自动化”标签页 → “创建个人自动化” → 选择“特定时间” → 设为每天22:55 → 关闭“运行前询问” → 添加操作 → 搜索“显示通知” → 标题填“正在清理临时文件”,正文填“5分钟后将关机” → 再添加操作 → 选择你刚建的“clean & shutdown”快捷指令。
【注意:此方案不会清理/private/var/folders下的系统级临时文件,因快捷指令无root权限,仅作用于当前用户可写路径】
验证清理是否生效
第一步:手动触发测试
在终端中运行:sudo /usr/local/bin/clean-before-shutdown.sh → 回车 → 检查~/Downloads和~/Library/Caches是否清空了旧临时文件。
第二步:检查LogoutHook是否注册成功
执行:sudo defaults read /Library/Preferences/com.apple.loginwindow LogoutHook → 正常应返回路径/usr/local/bin/clean-before-shutdown.sh。
第三步:确认pmset任务已就位
执行:pmset -g sched → 输出中必须同时出现“Scheduled shutdown for 23:00:00 every day”和“LogoutHook: /usr/local/bin/clean-before-shutdown.sh”。










