以下使用脚本的方式解决fcitx在使用当中占用大量cpu资源的问题,同时附有两个改进的代码,可以选择应用。本文的操作系统平台是Deepin Linux。
背景 用搜狗输入法的网友肯定有这样的体验:在使用过程中计算机风扇突然狂转起来,然后打开系统监视器一看,发现一个名为fcitx-input-method的进程占用的大量的资源,必须要kill掉重启才会正常。而出现这个问题的频率其实很高,每次都要手动kill掉很麻烦。于是我写了一个bash脚本,在后台监视fcitx-input-mehtod,一旦它占用的cpu大于10%时,就认为出现了问题,脚本会自动把它kill掉,然后它会自动重启,问题就解决了。
代码如下 #!/bin/bash PROCESS="fcitx" PID="" while [ ! $PID ]; do PID=`pgrep $PROCESS | head -n 1` done while [[ 1 ]]; do CPU=`top -b -p $PID -n 1 | tail -n 1 | awk '{print $9}'` if [[ $CPU > 10.0 ]]; then kill $PID PID="" while [ ! $PID ]; do sleep 1 PID=`pgrep $PROCESS | head -n 1` done # else # echo normal fi sleep 4 done
使用方法 把上面的代码保存为bash或者sh格式,然后设置为开机自启或者手动用nohup就能运行在后台了。
附:改进代码1 1.说明:把以上的代码改进了下,不用写systemd配置文件,直接配置一个.desktop放到~/.config/autostart/下,每次启动就会自动运行了。 2.代码如下 #!/bin/bash PROCESS="fcitx" PID="" while [[ 1 ]]; do while [ ! $PID ]; do sleep 1 PID=$(pidof $PROCESS) done CPU=$(top -b -p $PID -n 1 | tail -n 1 | awk '{print $9}') if [[ $CPU > 10.0 ]]; then kill $PID PID="" fi sleep 4 done
附:改进代码2 1.CPU占用率一时的高还是可以接受的,因此需要增加一个判断一段时间内的占用率都高的问题, 这里假定间隔时间1s,连续4次CPU占用率都高,才是真的需要kill掉。 2.代码如下 #!/bin/bash PROCESS="fcitx" function get_pid_x { #process PID="" while [ ! $PID ]; do PID=$(pidof $1) sleep 1 done echo $PID } function get_consume_cpu_process { #PID echo $(top -b -p $1 -n 1 | tail -n 1 | awk '{print $9}') } pid=$(get_pid_x $PROCESS) while [[ 1 ]]; do #echo "the fcitx's pid is $pid" #echo "the fcitx consumes $(get_consume_cpu_process $pid)%" if [[ $(get_consume_cpu_process $pid) > 10.0 ]]; then times=4 while [[ times > 0 ]]; do sleep 1 times=$(($times-1)) if [[ $(get_consume_cpu_process $pid) < 10.0 ]]; then break elif [[ $(get_consume_cpu_process $pid) > 10.0 && times = 0 ]]; then #echo "kill the process $pid." kill $pid pid=$(get_pid_x $PROCESS) #else #echo "not need to kill the process $pid" fi done fi sleep 4 done
相关主题 |