V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
coderbean
V2EX  ›  Apple

关于 MacOS 因为自带双拼输入法引起系统卡死的问题

  •  
  •   coderbean · 2022-11-30 14:37:35 +08:00 · 1928 次点击
    这是一个创建于 752 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我的电脑

    • 芯片:Apple M1 Pro
    • 内存:32GB
    • 系统:macOS Ventura 13.0.1

    问题描述

    最近换了新公司,然后换了新电脑。但是换了新电脑之后每过三四天整个电脑就会卡的要命。 具体表现为: 一旦有新的动作发生(例如切换 APP ),动作很慢,大概要等 5 分钟左右才会切换到另外一个 app 的窗口。曾经一度以为是内存的问题,因为发生后,切换 app 异常困难,打开活动监视器也是很慢,想要定位到是谁的问题,十分麻烦。所以每次都是重启解决。经过三四天问题又回重现。

    问题解决

    昨天又出现了同样的问题,但是不一样的是这次我发现输入法的选词界面卡在了那里,所以猜想是否是输入法的问题。耐住性子打开资源管理器,找到了“简体中文输入方式”未响应,另外 CPU 占用到了 90%+。然后强制退出后 CPU 占用恢复正常,也不再卡顿了。重新切换输入法,简体中文输入方式进程会重新启动,不再卡顿。

    复盘

    1. 同样的问题,别人用的搜狗输入法没有遇到
    2. 同样的问题,别人用的自带全拼输入法没有遇到
    3. 同样的问题,在上一个版本的 macOS 中也遇到了
    4. 目前写了一个脚本,快速杀掉“简体中文输入方式”进程,以后再遇到问题可以通过 kpy 快速解决了

    吐槽

    苹果的输入法总是有各种各样的问题,原来也看到有人遇到用久了会卡顿的问题,加上双拼用的人比较少,用苹果自带输入法的双拼的更少了,所以网上页查不到资料。

    附上脚本

    alias kpy="kill -9 `ps -ef | grep SCIM_Extension | grep -v grep | awk '{print $2}'`"
    

    “简体中文输入方式”对应的进程名是

    /System/Library/Input Methods/SCIM.app/Contents/PlugIns/SCIM_Extension.appex/Contents/MacOS/SCIM_Extension -AppleLanguages ("zh-Hans-CN", "en-CN")
    
    第 1 条附言  ·  2023-06-13 16:35:47 +08:00

    由于最近 MacOS 更新引入了快捷指令,通过快捷指令在菜单栏里面可以直接通过点击终止掉中文输入法,相比本来输入法就卡死的情况下再在终端输入命令的方式方便更多。附上我写的快捷指令,放到 macOS 快捷指令-菜单栏文件夹就行啦。 https://www.icloud.com/shortcuts/b08cb7c0cb58431aba0efcabec13d447 通知

    第 2 条附言  ·  2023-11-07 16:09:00 +08:00

    找GPT写个shell脚本

    我居然什么都不用改,直接就能用,下岗倒计时了😭 稍稍修改了下,kill 改成了 kill -9

    好的,如果您只需要每分钟执行一次脚本而不保存日志,您可以使用 cron 定时任务来实现。以下是更新后的脚本,不保存日志:

    #!/bin/bash
    
    # 检测简体中文输入法进程的 CPU 占用情况
    process_name="SCIM"  # 输入法进程的名称
    cpu_threshold=90  # CPU 占用阈值,超过该值则杀掉进程
    
    # 获取进程 ID 和 CPU 占用情况
    process_id=$(pgrep "$process_name")
    cpu_usage=$(ps -p "$process_id" -o pcpu=)
    
    # 检查 CPU 占用是否超过阈值
    if (( $(echo "$cpu_usage > $cpu_threshold" | bc -l) )); then
      echo "$(date) - CPU 占用超过 $cpu_threshold%,杀掉进程 $process_name (PID: $process_id)"
      kill -9 "$process_id"
    else
      echo "$(date) - CPU 占用正常,无需操作"
    fi
    

    请确保在脚本中将 process_namecpu_threshold 变量的值修改为您所需的值。

    接下来,您可以使用 cron 定时任务来每分钟执行脚本。运行以下命令以编辑定时任务:

    crontab -e
    

    在打开的编辑器中,添加以下行来设置每分钟执行脚本的定时任务:

    * * * * * /bin/bash /path/to/your/script.sh
    

    请将 /path/to/your/script.sh 替换为脚本的实际路径。

    保存并退出编辑器。现在,每分钟脚本将执行一次,不会保存日志。

    希望这次修改符合您的需求。如有任何其他问题,请随时提问!

    9 条回复    2023-11-07 16:08:13 +08:00
    Andreas8
        1
    Andreas8  
       2022-11-30 15:53:41 +08:00 via iPhone
    我是在 safari 用简拼的时候会卡住,用其他浏览器没问题
    kaz10025
        2
    kaz10025  
       2022-11-30 15:59:46 +08:00
    现在遇到的是 盒盖后就死机 能切换 app 但是鼠标转圈 只能强制重启
    tobemaster
        3
    tobemaster  
       2022-12-01 10:03:17 +08:00   ❤️ 1
    一模一样的情况,脚本可以优化一下
    ```bash
    kill `pgrep SCIM`
    ```
    不是双拼的问题,只要是中文输入法,甚至是繁体中文,都有人遇到过
    coderbean
        4
    coderbean  
    OP
       2022-12-01 14:30:36 +08:00
    @tobemaster 想问一下,怎么让反括号的内容每次都执行。我现在是放到了 alias 里面了,执行过一次,反括号里面的进程名就被写进一个临时变量了,下次再执行不会获取最新的进程好
    coderbean
        5
    coderbean  
    OP
       2022-12-01 14:45:01 +08:00
    最终的 alias 语句
    ```
    alias kpy='kill -9 $(pgrep SCIM)'
    ```
    原来单引号和双引号还不一样,双引号里面的 subshell 执行结果会暂存然后替换,单引号不会
    https://unix.stackexchange.com/questions/288506/how-to-save-an-alias-of-an-eval-other-comand-command
    tobemaster
        6
    tobemaster  
       2022-12-01 14:45:39 +08:00
    ```bash
    kill -9 `pgrep SCIM`
    ```
    加了-9 ,强制杀死进程,后面每次获取的就是新的 pid 了
    SakuraYuki
        7
    SakuraYuki  
       2022-12-19 19:48:24 +08:00
    全拼也会卡
    coderbean
        8
    coderbean  
    OP
       2023-06-13 16:30:42 +08:00
    由于最近 MacOS 更新引入了快捷指令,通过快捷指令在菜单栏里面可以直接通过点击终止掉中文输入法,相比本来输入法就卡死的情况下再在终端输入命令的方式方便更多。附上我写的快捷指令,放到 macOS 快捷指令-菜单栏文件夹就行啦。
    https://www.icloud.com/shortcuts/b08cb7c0cb58431aba0efcabec13d447
    [![pCm3Lse.png]( https://s1.ax1x.com/2023/06/13/pCm3Lse.png)]( https://imgse.com/i/pCm3Lse)
    coderbean
        9
    coderbean  
    OP
       2023-11-07 16:08:13 +08:00
    # 找 GPT 写个 shell 脚本
    > 我居然什么都不用改,直接就能用,下岗倒计时了😭
    > 稍稍修改了下,kill 改成了 kill -9


    好的,如果您只需要每分钟执行一次脚本而不保存日志,您可以使用 `cron` 定时任务来实现。以下是更新后的脚本,不保存日志:

    ```bash
    #!/bin/bash

    # 检测简体中文输入法进程的 CPU 占用情况
    process_name="SCIM" # 输入法进程的名称
    cpu_threshold=90 # CPU 占用阈值,超过该值则杀掉进程

    # 获取进程 ID 和 CPU 占用情况
    process_id=$(pgrep "$process_name")
    cpu_usage=$(ps -p "$process_id" -o pcpu=)

    # 检查 CPU 占用是否超过阈值
    if (( $(echo "$cpu_usage > $cpu_threshold" | bc -l) )); then
    echo "$(date) - CPU 占用超过 $cpu_threshold%,杀掉进程 $process_name (PID: $process_id)"
    kill -9 "$process_id"
    else
    echo "$(date) - CPU 占用正常,无需操作"
    fi
    ```

    请确保在脚本中将 `process_name` 和 `cpu_threshold` 变量的值修改为您所需的值。

    接下来,您可以使用 `cron` 定时任务来每分钟执行脚本。运行以下命令以编辑定时任务:

    ```bash
    crontab -e
    ```

    在打开的编辑器中,添加以下行来设置每分钟执行脚本的定时任务:

    ```
    * * * * * /bin/bash /path/to/your/script.sh
    ```

    请将 `/path/to/your/script.sh` 替换为脚本的实际路径。

    保存并退出编辑器。现在,每分钟脚本将执行一次,不会保存日志。

    希望这次修改符合您的需求。如有任何其他问题,请随时提问!
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2537 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 03:57 · PVG 11:57 · LAX 19:57 · JFK 22:57
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.