一个脚本解决fcitx在使用过程中突然消耗大量资源的问题。
Tofloor
poster avatar
ritter
deepin
2018-09-18 15:16
Author
本帖最后由 ritter 于 2018-9-18 07:20 编辑

用搜狗输入法的同学肯定有这样的体验:在使用过程中计算机风扇突然狂转起来,然后打开系统监视器一看,发现一个名为fcitx-input-method的进程占用的大量的资源,必须要kill掉重启才会正常。而出现这个问题的频率其实很高,每次都要手动kill掉很麻烦。于是我写了一个bash脚本,在后台监视fcitx-input-mehtod,一旦它占用的cpu大于10%时,就认为出现了问题,脚本会自动把它kill掉,然后它会自动重启,问题就解决了。当然这只是治标的办法,治本的方法我解决不了,不要搜狗的工程师来解决。××××××××××××××××××××××××以下为代码,我对bash一知半解,如果有更好的写法,欢迎大家修改×××××××××××××××××××××××××××××
#!/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就能运行在后台了。


Reply Favorite View the author
All Replies
avatar
zccrs
deepin
2018-09-18 17:12
#1
楼主可以直接做成一个 systemd service,然后提供deb包
Reply View the author
avatar
qq420100523
deepin
2018-09-18 17:19
#2
用这个命令获取进程id更准确一点
  1. PID=`pidof fcitx`
Copy the Code
Reply View the author
avatar
ritter
deepin
2018-09-19 04:07
#3
https://bbs.deepin.org/post/169008
用这个命令获取进程id更准确一点

这个可以,我改一下。感谢~~
Reply View the author
avatar
ritter
deepin
2018-09-19 04:09
#4
https://bbs.deepin.org/post/169008
楼主可以直接做成一个 systemd service,然后提供deb包

没这打算,就几句话而已,自己设置一下开机自启就行了。
Reply View the author
avatar
sudo_free
deepin
2018-09-19 04:22
#5
https://bbs.deepin.org/post/169008
没这打算,就几句话而已,自己设置一下开机自启就行了。

他的意思是帮你上架吧(毕竟是官方的
Reply View the author
avatar
摇摆哥
deepin
2018-09-19 05:01
#6
本帖最后由 supermew 于 2018-9-18 21:07 编辑

将上面的代码稍微改了改。。 不用写 systemd 配置文件, 直接配置一个 .desktop 放到~/.config/autostart/ 下, 每次启动就会自动运行了。
  1. #!/bin/bash
  2. PROCESS="fcitx"
  3. PID=""
  4. while [[ 1 ]]; do
  5.         while [ ! $PID ]; do
  6.                 sleep 1
  7.                 PID=$(pidof $PROCESS)
  8.         done
  9.         CPU=$(top -b -p $PID -n 1 | tail -n 1 | awk '{print $9}')
  10.         if [[ $CPU > 10.0 ]]; then
  11.                 kill $PID
  12.                 PID=""
  13.         fi
  14.         sleep 4
  15. done
Copy the Code
Reply View the author
avatar
y***z@tom.com
deepin
2018-09-19 05:15
#7
最好再加个条件,占有内存大于一定值,如120mb时,就kill掉重启。
Reply View the author
avatar
ritter
deepin
2018-09-19 11:51
#8
https://bbs.deepin.org/post/169008
将上面的代码稍微改了改。。 不用写 systemd 配置文件, 直接配置一个 .desktop 放到~/.config/autostart/  ...

牛逼,这个可以有
Reply View the author
avatar
qq420100523
deepin
2018-09-19 22:52
#9
本帖最后由 qq420100523 于 2018-9-19 15:30 编辑
https://bbs.deepin.org/post/169008
将上面的代码稍微改了改。。 不用写 systemd 配置文件, 直接配置一个 .desktop 放到~/.config/autostart/  ...

怎么写desktop文件?===========
方法见官方wifk:http://wiki.deepin.org/wiki/%E8%87%AA%E5%90%AF%E5%8A%A8%E7%A8%8B%E5%BA%8F
Reply View the author
avatar
摇摆哥
deepin
2018-09-20 03:31
#10
https://bbs.deepin.org/post/169008
牛逼,这个可以有

用 fcitx 只要打得拼音比较长时, 就会出现 cpu 占用比较高。 那个 10.0%, 可能第了点, 最好 20 或者以上, 要不会出现, 这样的情况 “ 当打了一串拼音时, 突然 fcitx 关闭了, 直接就是拼音上屏了。
Reply View the author
avatar
ritter
deepin
2018-09-20 10:51
#11
https://bbs.deepin.org/post/169008
用 fcitx 只要打得拼音比较长时, 就会出现 cpu 占用比较高。 那个 10.0%, 可能第了点, 最好 20 或者以 ...

有道理的,这个脚本中的CPU占用率和深度监视器里显示的不一样,出问题的时候,深度监视器显示fcitx16%左右,但是top显示出来的CPU占用率是100%,两个不一样的。
Reply View the author
avatar
摇摆哥
deepin
2018-09-20 16:26
#12
本帖最后由 supermew 于 2018-9-20 10:13 编辑

CPU占用率一时的高还是可以接受的, 因此需要增加一个判断一段时间内的占用率都高的问题, 这里假定间隔时间1s,连续4次CPU占用率都高, 才是真的需要kill掉。这是稍作修改后的代码。

  1. #!/bin/bash
  2. PROCESS="fcitx"

  3. function get_pid_x { #process
  4.         PID=""
  5.         while [ ! $PID ]; do
  6.                 PID=$(pidof $1)
  7.                 sleep 1
  8.         done
  9.         echo $PID
  10. }

  11. function get_consume_cpu_process { #PID
  12.         echo $(top -b -p $1 -n 1 | tail -n 1 | awk '{print $9}')
  13. }

  14. pid=$(get_pid_x $PROCESS)
  15. while [[ 1 ]]; do
  16.         #echo "the fcitx's pid is $pid"
  17.         #echo "the fcitx consumes $(get_consume_cpu_process $pid)%"
  18.         if [[ $(get_consume_cpu_process $pid) > 10.0 ]]; then
  19.                 times=4
  20.                 while [[ times > 0 ]]; do
  21.                         sleep 1
  22.                         times=$(($times-1))
  23.                         if [[ $(get_consume_cpu_process $pid) < 10.0 ]]; then
  24.                                 break
  25.                         elif [[ $(get_consume_cpu_process $pid) > 10.0 && times = 0 ]]; then
  26.                                 #echo "kill the process $pid."
  27.                                 kill $pid
  28.                                 pid=$(get_pid_x $PROCESS)
  29.                                 #else
  30.                                 #echo "not need to kill the process $pid"

  31.                         fi
  32.                 done
  33.         fi
  34.         sleep 4
  35. done


Copy the Code

Reply View the author
avatar
y***z@tom.com
deepin
2018-09-20 17:11
#13
本帖最后由 yjgsz 于 2018-9-20 16:03 编辑

我也弄了个脚本,判断搜狗拼音的内存占用情况(不判断CPU占用),当超过指定值(我设定的是150mb,以资源监视器中看到的为基准),就强制关闭该进程,再重启搜狗拼音,以防止出现内存泄漏占用几个G,导致系统反映变慢甚至死机的情况.
脚本采用循环方式,每30秒检查一次(时间间隔可自行更改).只要添加到自启动就行了,不用加到系统服务.也可以保存为sh文件放在桌面上,每次开机后双击运行一下就OK了.自动在后台监控搜狗拼音的内存占用情况,一旦超标就杀死并重启进程.

#!/bin/bash

PROCESS="sogou-qimpanel"  #进程名
MAXMEM=153600    #最大内存阀值,单位KB,如判断物理内存,下面要用VmRSS 参数.

while true
do

ID=`ps -ef | grep "${PROCESS}" | grep -v "grep" | awk '{print $2}'`

if [ ! -n "$ID" ]; then
    # echo "$PROCESS not exist"
    exit 1

  else

   # MEM=`cat /proc/$ID/status | grep -e VmRSS | awk '{print $2}'`
   MEM=`cat /proc/$ID/status | grep -e RssAnon | awk '{print $2}'`

   if [ $MEM -gt $MAXMEM ]; then
    #超过了,kill或者restart进程
    kill $ID
    sleep 3

    /usr/bin/sogou-qimpanel start
   fi

fi

sleep 30

done



Reply View the author
avatar
摇摆哥
deepin
2018-09-20 17:54
#14
https://bbs.deepin.org/post/169008
我也弄了个脚本,判断搜狗拼音的内存占用情况(不判断CPU占用),当超过指定值(我设定的是150mb,以资源监视器中 ...

一时的CPU内存占用高, 是比较正常的, 但是不能判断一段时间内都高的问题。 不好处理啊。
Reply View the author
avatar
ritter
deepin
2018-09-21 12:38
#15
https://bbs.deepin.org/post/169008
CPU占用率一时的高还是可以接受的, 因此需要增加一个判断一段时间内的占用率都高的问题, 这里假定间隔时 ...

很有道理,这就是社区的力量,大家一起把一样东西越做越好。
Reply View the author
avatar
S4mW0ng
deepin
2018-09-21 19:19
#16
是搜狗拼音造成的吗?
Reply View the author
avatar
firstuanl
deepin
2018-09-21 21:35
#17
mark
Reply View the author