以下使用脚本的方式解决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
相关主题