之前接手的 python 项目有个奇怪的问题,运行几天时间后,即便线程并不多,也会占用很高的 CPU 资源。有时用 top 命令查看还会进入 T 暂停状态,暂时还没找到原因,但除此之外,python 服务器运行功能还算正常。
为了解决服务器不知什么时候会“假死”的状态,我打算临时写个 shell 脚本定时监视服务器的 CPU 占用率,超过 95% 就杀掉重启,只要速度够快,就不会影响客户端使用。
shell 脚本编写
获得进程 ID 和 CPU 占用率
查看进程的命令有 top,ps,但为了精准查找想要的 python 进程,我习惯用 ps -ef
命令,根据 python 服务器的脚本名来找进程 ID。
cpu=$(ps -ef | grep "server.py" | grep -v grep | awk '{print int($4)}')
pid=$(ps -ef | grep "server.py" | grep -v grep | awk '{print int($2)}')
直接通过 ps 和 grep 命令找进程会出现两条结果,一条是真正的 python 服务进程 server.py,另一个是 grep 命令的搜索进程,出现顺序也不固定,很恼人。
ps -ef | grep "server.py"
ubuntu 13376 1977 97 10:38 pts/2 04:30:59 python /home/ubuntu/server.py
ubuntu 17211 11502 0 15:16 pts/3 00:00:00 grep --color=auto server.py
为了排除这条干扰信息,在命令后加一条 grep -v grep
即可。
在 screen 中重启
有时我想在前台长期运行某一任务,不过一旦关闭远程连接程序就会断掉。所以推荐新建一个 screen,即便远程连接断掉,程序也会继续运行,再次登录时,通过 screen 命令进入,就可以回到上次运行时的终端状态了。
比如我之前新建的 screen 名称为 server,并且在这个 server 终端运行了 python 服务器脚本。
screen -S server
找到 CPU 占用率过高的进程 ID 并杀掉,确保指定的 screen 没有被占用的情况下,直接发送重启命令。
screen -d server
screen -r server -p 0 -X stuff "python /home/ubuntu/server.py"
screen -r server -p 0 -X stuff $'\n'
完整 shell 脚本
#!/bin/sh
cpu=$(ps -ef | grep "server.py" | grep -v grep | awk '{print int($4)}')
pid=$(ps -ef | grep "server.py" | grep -v grep | awk '{print int($2)}')
if [ $cpu -gt 95 ]
then
echo `date` >> /home/ubuntu/restart.log
echo cpu: $cpu >> /home/ubuntu/restart.log
echo pid: $pid >> /home/ubuntu/restart.log
echo ++++++++++++++++++++++++++++++++++++++++++++++++ >> /home/ubuntu/restart.log
kill -9 $pid
screen -d server
screen -r server -p 0 -X stuff "python /home/ubuntu/server.py"
screen -r server -p 0 -X stuff $'\n'
fi
命名脚本 checkCpu.sh,添加可执行权限。
chmod +x checkCpu.sh
新增 crontab 定时任务
编辑 /etc/crontab,新增如下任务,每三分钟检查一次 python 服务状态。
*/3 * * * * /home/ubuntu/checkCpu.sh
执行如下命令让刚才配置的定时任务生效
crontab /etc/crontab
检查当前已生效的所有定时任务
crontab -l
确保可以看到新增的任务就等待脚本生效吧。下面是我实际运行过程中 CPU 占用过高,进程被杀掉后重启的监视日志。
Thu Dec 7 09:18:52 CST 2021
cpu: 98
pid: 12154
++++++++++++++++++++++++++++++++++++++++++++++++
Thu Dec 11 02:48:31 CST 2021
cpu: 99
pid: 12411
++++++++++++++++++++++++++++++++++++++++++++++++
Thu Dec 15 18:22:06 CST 2021
cpu: 96
pid: 12438
++++++++++++++++++++++++++++++++++++++++++++++++
screen -r server
进入程序终端后,程序运行和日志打印都正常,仿佛什么都没有发生。
希望能早日找到 CPU 占用异常的原因吧。