mac每日23:00自动关机需先优雅退出应用:推荐快捷指令+applescript方案,先注销保存状态再关机;或用launchd后台执行退出脚本;亦可替换系统shutdown命令实现预退出。

你想让Mac在每天晚上11点自动关机,但又怕微信、Chrome或正在渲染的Final Cut Pro项目来不及保存就强制断电——系统默认关机前会弹窗提醒,可一旦你没盯着屏幕,未保存内容就会丢失。必须让关机前先逐个退出所有前台应用,再执行关机指令。
用快捷指令+AppleScript实现“先退出程序再关机”
这是最直观、无需终端命令的方法,适合日常固定作息且希望看到弹窗确认的用户。
第一步:打开“快捷指令”App → 点右上角“+”新建快捷指令 → 命名为“优雅关机”。
第二步:点“添加操作” → 搜索“运行 AppleScript” → 点击添加。
第三步:在脚本框中粘贴以下代码:
osascript -e 'tell application "System Events" to log out' -e 'delay 2' -e 'do shell script "sudo shutdown -h now" with administrator privileges'
⚠️ 注意:这行脚本会先触发系统注销(等效于退出全部图形应用并保存状态),等待2秒后执行强制关机;【首次运行时必须手动输入管理员密码,且需在“系统设置→隐私与安全性→完全磁盘访问”中授权快捷指令】。
第四步:回到快捷指令主界面 → 切换到“自动化”标签 → “创建个人自动化” → 选“特定时间” → 设为22:50(比目标关机时间早10分钟)→ 关闭“运行前询问” → 点“下一步” → 添加操作 → 选择刚建好的“优雅关机”快捷指令 → 完成。
用终端+launchd配置后台可靠退出流程
这个方法不依赖用户是否登录、不弹窗、不卡在未保存文档确认页,由系统守护进程接管,适合长期稳定运行。
方法一:创建退出脚本
打开终端,执行:
mkdir -p ~/Scripts && nano ~/Scripts/graceful_shutdown.sh
在nano编辑器中粘贴以下内容:
#!/bin/bash
# 获取所有前台GUI应用名称
apps=$(osascript -e 'tell application "System Events" to get the name of every process whose frontmost is true')
for app in $apps; do
if [[ "$app" =~ ^[A-Za-z0-9\ ]+$ ]]; then
osascript -e "try\ntell application \"$app\" to quit\non error\ntell application \"System Events\" to key code 53\ndelay 0.5\nend try"
fi
done
sleep 3
shutdown -h now
按 Control+O 保存 → 回车确认文件名 → Control+X 退出。再执行:
chmod +x ~/Scripts/graceful_shutdown.sh
方法二:配置launchd定时任务
执行:
nano ~/Library/LaunchAgents/com.user.graceful-shutdown.plist
粘贴以下内容(设为每天22:55执行):
保存退出后,加载任务:
launchctl load ~/Library/LaunchAgents/com.user.graceful-shutdown.plist
用单条pmset命令+预退出脚本组合
如果你已习惯用pmset设每日关机,又不想放弃对应用退出的控制,可以将退出逻辑封装进shell脚本,再由pmset调用。
第一步:创建预退出脚本
执行:
echo '#!/bin/bash\nosascript -e "tell application \"System Events\" to log out" -e "delay 2"\nshutdown -h now' > ~/shutdown_with_logout.sh && chmod +x ~/shutdown_with_logout.sh
第二步:用pmset绑定该脚本执行
执行:
sudo pmset repeat shutdown MTWRFSU 23:00:00
第三步:覆盖系统默认关机行为
执行:
sudo mv /sbin/shutdown /sbin/shutdown.original && sudo ln -s ~/shutdown_with_logout.sh /sbin/shutdown
【此操作会永久替换系统shutdown命令,请务必先测试脚本是否能正常退出应用并关机,否则可能导致无法关机】。











