安基网 首页 系统 网络学院 查看内容

记一次服务器CPU跑满事件

2020-5-23 23:29| 投稿: xiaotiger |来自: 互联网


免责声明:本站系公益性非盈利IT技术普及网,本文由投稿者转载自互联网的公开文章,文末均已注明出处,其内容和图片版权归原网站或作者所有,文中所述不代表本站观点,若有无意侵权或转载不当之处请从网站右下角联系我们处理,谢谢合作!

摘要: 昨天早上,打开电脑发现自己的博客网站打开不了,准备远程登录服务器查看问题,发现服务器远程不上。没办法,登录阿里云后台,重启服务器。重启完成后,网站能正常打开,所以当时就不以为然,以为阿里云那边是不是出了什么毛病。

本文为php中文网认证作者:“齐天大圣”投稿,欢迎加入php中文网有偿投稿计划!

事情经过

昨天早上,打开电脑发现自己的博客网站打开不了,准备远程登录服务器查看问题,发现服务器远程不上。没办法,登录阿里云后台,重启服务器。重启完成后,网站能正常打开,所以当时就不以为然,以为阿里云那边是不是出了什么毛病。

到了下午的时候,发现网站又打不开了,而且又远程连接不了服务器。进入阿里云控制台,查看监控发现cpu跑满了。只能再重启服务器,等重启完成后再远程连接上去,这次需要好好排查问题。

解决问题

当时首先想到的是中病毒了,先不管那么多,第一步是找到那些耗cpu的进程杀死。使用top命令,查看耗cpu的进程有哪些。一看就明白了,都是bzip2搞得鬼。

杀进程的过程发现一个问题,就是这些进程杀死了,过一会又出现了。这种现象,我知道肯定要找到他们的父进程,擒贼先擒王。

# ps -lA | grep bzip2

0 R 0 1965 1964 44 80 0 - 3435 - ? 00:01:43 bzip2

0 S 0 1981 1980 33 80 0 - 3435 pipe_w ? 00:00:56 bzip2

0 R 0 1997 1996 30 80 0 - 3435 - ? 00:00:31 bzip2

0 R 0 2013 2012 27 80 0 - 3435 - ? 00:00:07 bzip2

0 R 0 2024 2023 15 80 0 - 3435 - ? 00:00:00 bzip2

但是发现他们的ppid不是同一个,这就让我很疑惑了。我打算用进程树看看

pstree -up

这时候,我就知道了,原来是自己的定时脚本有问题。那么我需要做以下几件事:

  1. 关闭crond服务
  2. crontab -e 将weekly.sh去掉
  3. 杀掉那些耗cpu的进程

# 关闭

[root@iz8vb626ci0aehwsivxaydz ~]# kill 1622

[root@iz8vb626ci0aehwsivxaydz ~]# systemctl status crond

● crond.service - Command Scheduler

Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor preset: enabled)

Active: inactive (dead) since Tue 2019-11-12 10:44:32 CST; 10s ago

Main PID: 1622 (code=exited, status=0/SUCCESS)

# 修改crontab -e

# 杀掉耗cpu进程,下面的命令执行了好几遍,才将所有耗cpu进程全部杀掉了

ps -lA | grep bzip2 | awk '{print $4}' | xargs -n 10 kill -9

问题原因与思考

刚开始,我以为是自己的shell脚本有问题,出现死循环导致问题出现。但是查看脚本,发现没有问题,没有死循环的情况出现。一时间,百思不得姐。

#!/bin/bash

# 每周备份脚本

export PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

export

backdir=/backup/weekly # 备份目录

[ -z "$backdir" ] || mkdir -p $backdir

dirs=(/etc /home /root /usr /var/spool/cron /var/spool/at) # 需要备份的目录

for dir in ${dirs[@]}

do

if [ ! -d $dir ];then

continue

fi

cd $backdir

tar -jcpf $(basename $dir)_$(date +%Y%m%d).tar.bz2 $dir

done


# 删除mtime大于30天的文件

find $backdir -mtime +30 -name *.tar.bz2 -exec rm -f {} ;

过了很长时间,终于找到了原因所在,原来是自己的定时任务写法有问题

* 3 * * 1 /root/bin/weekly.sh 1>/dev/null 2>&1

我原本的想法是每周1凌晨3点执行一次备份脚本,但是这样写的结果是每周一凌晨3点的每分钟都会执行该脚本一次。正确的写法应该如下:

# 每周一凌晨三点零一分执行该脚本

1 3 * * 1 /root/bin/weekly.sh 1>/dev/null 2>&1

问题解决了,原因也找到了。自己该写一个服务器资源监控脚本了。



小编推荐:欲学习电脑技术、系统维护、网络管理、编程开发和安全攻防等高端IT技术,请 点击这里 注册账号,公开课频道价值万元IT培训教程免费学,让您少走弯路、事半功倍,好工作升职加薪!

本文出自:https://www.toutiao.com/a6829930779124957704/

免责声明:本站系公益性非盈利IT技术普及网,本文由投稿者转载自互联网的公开文章,文末均已注明出处,其内容和图片版权归原网站或作者所有,文中所述不代表本站观点,若有无意侵权或转载不当之处请从网站右下角联系我们处理,谢谢合作!


鲜花

握手

雷人

路过

鸡蛋

相关阅读

最新评论

 最新
返回顶部