🌑

ShiiNashi's blog

解决macOS的间歇性卡死/彩虹圈问题

Updated: 7/28/2023
Released: 6/10/2023
Tags: ,

  1. 解决方法
    1. 出现卡死时,杀掉输入法进程
      1. 从任务监视器杀掉进程
      2. 从终端杀掉进程
      3. 预设杀进程脚本
    2. 预设定时杀脚本任务
    3. 其他可能有效的方法
  2. 鸣谢

我使用M1 macbook air,系统为macOS Venture,使用过程中,会间歇性遭遇到系统卡死问题。出现问题时,各app均无法控制,键盘输入卡顿显著,鼠标持续呈彩虹圈,但已打开的app(如正在播放的音乐等)仍能正常工作。重启系统后问题解决,但过一段时间(1~2天后)问题又会再度出现。

经过长时间的搜索,最终确定该问题是由macOS的原生中文输入法导致的。该问题隐蔽又难以定位,且仅在体量本来就较小的macOS中文圈才存在。这个问题似乎在很早期版本的macOS就存在并持续至今,但并非会在所有用户的macOS中出现。问题的具体原因仍不清楚。

接下来给出几种解决该问题的方法。

解决方法

出现卡死时,杀掉输入法进程

处于卡死状态时,杀掉输入法进程即可让系统恢复常态。有以下几种选择:

从任务监视器杀掉进程

打开任务监视器,如下图找到中文输入法进程,点quit关掉它。

从终端杀掉进程

打开终端,输入并执行:

kill `pgrep SCIM`

以上代码中:

  • kill:发送一个强制杀死的信号给指定的进程。
  • pgrep SCIM:查找所有名称为 SCIM 的进程,并返回它们的 PID (进程 ID)。注意这里输入的是反引号(`,键盘1左边的那个按键)而不是单引号。

预设杀进程脚本

在系统卡死的情况下,输入这串代码也不是那么容易。一种替代的办法是使用工作流app,在卡死时执行预设的这段代码,帮我们省下敲键盘的时间。

以最常用的Alfred为例,在工作流中新建一个两步的工作流,第一步是键盘输入,名称随便起,但唤起该工作流的关键词越短越好(卡死的时候输入每一个字符都很耗时),我这里设置的是doit:

第二步是执行脚本,按下图设置:

这样,在卡死的时候,唤起Alfred,输入doit即可执行前文杀掉输入法进程的命令,省下一些卡死的时间。

预设定时杀脚本任务

以上杀脚本的方法可以临时解决卡死问题,但始终是治标不治本。我们不希望卡死的状态在一些诸如会议的时刻发生。那么可以预设一个定时杀脚本的任务。

macOS执行定期脚本的工具是cron。它可以让用户在指定的时间间隔内执行某个命令或者某些脚本。一个 cron表达式通常由6个或7个用空格或者制表符分隔的时间字段组成,包括秒、分、小时、日期、月份和星期几。例如:

30 5 * * * /usr/bin/reboot

这个cron表示在每天的凌晨5点30分钟重启计算机。

接下来我们来设置一个定期杀输入法进程的任务。打开终端,输入并执行:

crontab -e

这里的-e将执行文字编辑器来设置cron任务。如果你没有设置过环境变量,默认的编辑器是VI。还有其他可执行的命令包括:

crontab -l #显示当前的任务列表
crontab -r #删除当前的任务列表

执行命令后,我们会看到如下提示符:

□
~
~
~
~
~
~
~
~
"/tmp/crontab.LUSbqPLkBv" 1L, 30B

现在显示的是一个空白的cron文件。是我们的游标位置,~显示这个文件中没有任何内容。我们可以用方向键控制游标在文件中的位置。

VI编辑器有三种模式,我们现在处于命令模式。点击快捷键i进入编辑模式,会看到下方提示符变为了:

--INSERT--

此时从命令模式进入编辑模式,输入下列定时任务:

0 */2 * * * kill `pgrep SCIM`

*/n的意思是每隔n个时间(根据所在位置决定),那么该代码的意思就是每2小时执行一次杀死输入法进程的命令。然后点Esc回到命令模式,输入并执行:

:wq

执行后会从cron文件中退出。再次输入:

crontab -l

如果设置成功的话,我们会看到刚刚设置的定时任务。定时杀死输入法进程的任务也就设置好了。但经测试,进程卡死的发生存在随机性,这种方法也不能完全根除这个问题。

其他可能有效的方法

最简单有效的方法是不使用macOS原生的中文输入法。但因为一个bug而弃用整个输入法未免有些因噎废食。

这篇文章给出了一系列调整可能导致该问题的设置的方法,包括节电模式、自定义短语、Chrome等,但这些问题在我的macOS上并不存在,也许会对一部分用户起作用,可以尝试。

bilibili的这个视频表示关闭Capslock的中英切换可以解决问题,评论也表示关闭“触控栏输入建议”也可以解决问题。我不希望关闭Capslock的切换功能。各位也可以尝试一下。

鸣谢

最初找到这个问题的原因是在V2EX的这个帖子,并根据简书上的这篇文章设置了杀进程的任务。感谢文章中提及的所有内容贡献者,希望这个bug早日得到修复。


Search