MacBook Pro无内置断开键盘即关机功能,需通过脚本+launchd轮询监听USB或蓝牙外设状态,检测断开后执行sudo shutdown -h now;须按连接方式选对应脚本、授权钥匙串、每5秒检查一次。

MacBook Pro无法自动感知外接键盘拔出并触发关机,系统没有内置的“断开键盘即关机”功能。你需要借助自动化工具监听蓝牙或USB设备状态变化,并在检测到键盘断开时执行关机命令。整个过程依赖终端脚本与后台守护进程配合,不涉及修改系统核心参数,所有操作均可逆。
确认外接键盘连接方式
先判断你的键盘是通过蓝牙还是USB-C直连。打开“系统设置”→“蓝牙”,查看键盘名称右侧是否显示“已连接”;若未启用蓝牙或键盘无蓝牙标识,则大概率走USB路径。USB设备在系统中以IORegistry树节点存在,响应更快;蓝牙设备需依赖bluetoothd服务状态,延迟略高但兼容性更好。这一步决定后续监听逻辑的实现路径——选错类型会导致脚本完全不触发。
USB键盘:设备名通常含“Apple Keyboard”或厂商名,接入后会在/dev下生成类似usbmodem14301的节点(具体名称用ls /dev/tty.*查看)。
蓝牙键盘:在终端运行system_profiler SPBluetoothDataType | grep -A 10 "Devices"可确认当前配对列表及连接状态。
创建关机触发脚本
打开“访达”→按下Shift+Command+G→输入/usr/local/bin→回车。若提示权限不足,先在终端执行sudo mkdir -p /usr/local/bin并输密码。
用文本编辑器新建文件,命名为keyboard-off-shutdown.sh,粘贴以下内容(根据上一步确认的连接方式二选一):
【USB方式】
#!/bin/bash
if ! ls /dev/tty.* | grep -q "your_usb_device_name"; then
sudo shutdown -h now
fi
将your_usb_device_name替换成你实际看到的设备名(如usbmodem14301),注意保留引号。此脚本每执行一次就检查一次设备是否存在,不存在则立即关机。
【蓝牙方式】
#!/bin/bash
if ! system_profiler SPBluetoothDataType 2>/dev/null | grep -q "your_keyboard_name.*Connected: Yes"; then
sudo shutdown -h now
fi
将your_keyboard_name替换为你键盘在蓝牙设置里的完整显示名(如Logitech MX Keys),大小写和空格必须完全一致。此检查依赖系统报告,若蓝牙服务异常可能漏判。
保存后,在终端执行:sudo chmod +x /usr/local/bin/keyboard-off-shutdown.sh赋予执行权限。
配置定时监听任务
macOS不支持热插拔事件直接绑定关机,只能靠轮询。我们用launchd创建一个每5秒检查一次的守护进程:
第一步:在终端运行mkdir -p ~/Library/LaunchAgents
第二步:用文本编辑器新建文件,保存为~/Library/LaunchAgents/local.keyboard.shutdown.plist,内容如下:
第三步:加载任务:launchctl load ~/Library/LaunchAgents/local.keyboard.shutdown.plist
【关键前提】脚本中调用的shutdown -h now需要管理员权限,首次运行会弹出钥匙串授权窗口,必须点击“始终允许”,否则后续自动关机将失败。若错过此步,需手动删除对应钥匙串条目并重试。
验证与调试
拔掉外接键盘,等待最多5秒。若屏幕黑屏且风扇停转,说明成功;若无反应,立即打开终端执行tail -f /tmp/keyboard-shutdown.log查看报错信息。
常见问题:USB设备名在重启后可能变更(如从usbmodem14301变成usbmodem14302),此时需重新运行ls /dev/tty.*更新脚本;蓝牙名称含特殊字符(如括号、&)会导致grep匹配失败,应改用system_profiler SPBluetoothDataType | grep -A 5 "your_keyboard_name"人工确认原始输出格式。
停止监听:在终端执行launchctl unload ~/Library/LaunchAgents/local.keyboard.shutdown.plist即可。


















