shell + crontab 实现进程监视与重启

博主通过编写shell脚本,定时检查Python服务进程的CPU占用率,当超过95%时,脚本将自动杀死并重启进程。脚本利用`ps`命令获取进程ID,结合`screen`在后台安全重启服务,并通过`crontab`设置定时任务。此外,还记录了重启日志以供后续问题排查。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


之前接手的 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 占用异常的原因吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值