给机器人加关机功能,结果电脑差点变砖

今天早上刚打开电脑想开始学习,并且测试一下我给微信机器人加的开机自启动功能,结果我一开机就显示关机倒计时。本来想用命令行输入 shutdown /a 来中断关机命令,结果发现只有十秒钟缓冲的时间,根本不够我输入命令。就这样循环了几次之后我终于找到了办法——进入安全模式。于是我等电脑关机后进入了安全模式,删除了我的机器人开机自启动注册表,这样才勉强把我的电脑救回来。如果我再晚一点想出来正确办法,可能我的电脑真的就要变成一块"板砖"了。

解决掉自动关机问题后,我就开始排查到底是哪里出了问题。我翻了下和微信机器人的聊天记录,才想起来昨晚我让机器人关机的时候这个功能还没加,之后又让 AI 加上去之后我就关机睡觉了。我让 AI 调取了昨天的日志,发现是因为 watcher 每次开机重启时 last_timestamp = "",所以它把昨天会话里那行"关机"重新处理了一遍——于是开机就关机。把这个毛病也修好之后,现在 watcher 启动时用当前时间作为起点,旧消息会自动跳过。

然后我就学聪明了,我让 AI 把关机倒计时延长到 30 秒,这样如果我突然不想关机了也能有时间取消这个命令。但是 Windows 自带的弹窗没有取消关机的按钮,而且如果走机器人途径处理关机,计算机响应速度可能不够,等 30 秒关机时间到了,可能还没执行取消关机的程序。

于是我用 PowerShell 自己写了一个弹窗——有倒计时和取消按钮,也能通过微信直接取消关机。原理是 watcher 创建一个标记文件,弹窗每秒检查文件还在不在。"取消关机"的时候 watcher 删掉标记文件,弹窗发现文件没了就自己关。但实际测试发现,Python 写的文件和 PowerShell 读到的状态经常不同步,这个方案最终失败了。

然后又试了 PID 杀进程方案和让 AI 直接处理关机的方案。最大的问题是:给机器人发送消息的时候,watcher 和 AI 两条线都会来参与。我让 watcher 执行关机的时候,AI 也会来处理"关机"这两个字,一直找我要 PowerShell 的权限,取消关机的指令被卡在排队里,30 秒根本不够用。

所以到最后我把那些花里胡哨的东西全删了。现在发"关机",watcher 直接执行 shutdown /s /t 30。想取消就双击桌面上的快捷方式 shutdown /a

我一直要搞取消关机,就是想着万一手滑了还能反悔。但后来又想,你既然都向电脑发关机的指令了,一般都是真的打算关机了。如果是临时离开座位忘锁屏,那加个锁屏命令就行。既然关机和锁屏都做了,不如把重启和睡眠也做了——反正都是同一个套路。

← 回到首页