mac每日23:00自动关机并安全卸载加密卷:先用pmset设置定时关机,再通过launchd托管自定义safe-shutdown.sh脚本,该脚本调用applescript弹出所有可移动卷、锁定钥匙串,最后执行shutdown -h now,确保filevault卷卸载锁定且无人登录时仍可靠触发。

你想让Mac每天固定时间自动关机,同时确保关机前所有已挂载的加密磁盘映像、iCloud同步文件夹、Time Machine备份卷等全部安全卸载并锁定——这不是系统默认行为,必须组合调度命令与卷管理逻辑才能实现。
用终端命令设置每日定时关机(系统级可靠)
这一步绕过用户登录状态限制,由launchd守护进程托管,即使无人登录也准时触发关机,真正切断电源。
打开“终端”(Command + 空格 → 输入“终端” → 回车)。
先清空已有重复调度:输入sudo pmset repeat cancel → 回车 → 输入管理员密码(无字符显示,正常输入)。
设置每天23:00:00关机:输入sudo pmset repeat shutdown MTWRFSU 23:00:00 → 回车 → 再次输入密码。注意时间必须带秒,格式为HH:MM:SS,否则命令静默失败。
验证是否写入成功:输入pmset -g sched → 回车,输出中应出现一行含“shutdown”和“23:00:00”的条目。
关机前强制卸载并锁定所有可移动/加密卷
macOS不会在关机前主动卸载已挂载的.dmg、.sparsebundle或FileVault加密卷;若未手动弹出,关机后它们可能仍以只读方式残留挂载,导致下次启动时自动重挂载并保持解锁态。
方法一:用AppleScript批量卸载非系统卷
打开“脚本编辑器”(Command + 空格搜“脚本编辑器”)→ 新建文档 → 粘贴以下内容:
tell application "Finder"<br>repeat with d in every disk<br>if (local volume of d) is false and (ejectable of d) is true then<br>try<br>eject d<br>end try<br>end if<br>end repeat<br>end tell
点击“编译” → “文件” → “导出”,格式选“应用程序”,命名为“EjectAllVolumes.app”,保存到/usr/local/bin/(需访达显示隐藏文件夹:Command+Shift+.)。
方法二:终端命令一键锁定所有FileVault卷
在终端中执行:sudo diskutil apfs unlockVolume /dev/diskXsY -passphrase "your_password" → 先临时解锁 → 再执行:sudo diskutil apfs lockVolume /dev/diskXsY。但该操作需提前知道设备标识符,不适用于通用场景。
【关键前提】必须先用diskutil list确认所有加密卷路径,否则lockVolume会报错“Invalid device”且无法回退。
封装为关机前自动执行的复合脚本
把卸载动作和关机命令打包成一个可调度的Shell脚本,确保顺序执行、不跳过任何环节。
第一步:新建脚本文件
打开“文本编辑”,新建文件,粘贴以下内容:
#!/bin/bash<br># 卸载所有可弹出卷<br>osascript -e 'tell application "Finder" to eject (every disk whose ejectable is true)'<br># 等待2秒确保卸载完成<br>sleep 2<br># 锁定登录钥匙串(防止关机后自动登录仍保持解锁)<br>security lock-keychain -a<br># 最终执行关机<br>sudo shutdown -h now
第二步:保存并授权
保存为safe-shutdown.sh,存至/usr/local/bin/目录下。在终端中执行:sudo chmod +x /usr/local/bin/safe-shutdown.sh → 回车。
第三步:替换原生调度目标
执行sudo pmset repeat cancel清空旧计划,再运行:sudo pmset repeat shutdown MTWRFSU 23:00:00 → 此时系统仍调用原生关机,需进一步用launchd接管。
第四步:创建自定义launchd任务
在~/Library/LaunchAgents/下新建com.user.safe-shutdown.plist,内容如下:
<?xml version="1.0" encoding="UTF-8"?><br><br><plist version="1.0"><br><dict><br><key>Label</key><br><string>com.user.safe-shutdown</string><br><key>ProgramArguments</key><br><array><br><string>/usr/local/bin/safe-shutdown.sh</string><br></array><br><key>StartCalendarInterval</key><br><dict><br><key>Hour</key><br><integer>23</integer><br><key>Minute</key><br><integer>0</integer><br></dict><br></dict><br></plist>
第五步:加载并启用
在终端中执行:launchctl load ~/Library/LaunchAgents/com.user.safe-shutdown.plist → 回车。











