Updated: 7/28/2023Released: 6/10/2023Tags: macOS, technology
解决方法出现卡死时,杀掉输入法进程从任务监视器杀掉进程从终端杀掉进程预设杀进程脚本预设定时杀脚本任务其他可能有效的方法鸣谢我使用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早日得到修复。
View / Make Comments