公司有几台空闲的服务器,最近打算用他们来做一系列的docker-compose搭建各种中间件集群的教程,然后上zabbix发现这几台服务器cpu全部占用100%。




centos7 进程无法kill掉 centos 进程被killed_Powered by 金山文档


那就选其中一台上去看看是什么情况。

上到服务器,先top查看一下有什么进程在跑。大写M排个序看看;


centos7 进程无法kill掉 centos 进程被killed_centos7 进程无法kill掉_02


果然,有个叫kthreaddk的东西没见过而且占用了资源,应该是kthreaddi的变种吧,之前也处理过。那这次也按照步骤处理吧,pid看一下是3106。

首先,先确认一下处理思路,直接kill大概率是会重新又跑出来的,我们就先检查服务器看看有什么地方是和平常不一样的或者没见过的,如果不确定可以把进程名复制出来去百度一下,一般有用的都能百度出来的。所以我先systemctl status 3106 查看一下是不是有什么守护进程在跑。


centos7 进程无法kill掉 centos 进程被killed_centos_03


仔细看Loaded配置文件的位置,开机启动(disabled代表启用);Active表示正在运行;那我们就cd进去/run/systemd/system看一下里面有什么吧。


centos7 进程无法kill掉 centos 进程被killed_Powered by 金山文档_04


发现一堆从来没见过的东西,暂时先不动,再检查一下其他地方。

进去/ect里面检查一下cron.daily、cron.hourly、cron.monthly、cron.weekly这几个定时器文件夹里面有没有什么奇怪的东西。


centos7 进程无法kill掉 centos 进程被killed_linux_05


再看一眼crontab -l看看有什么定时任务,其实这个命令查看的内容对应的是/var/spool/cron/这个文件夹里对应用户名的文件内容,也可以直接进去修改或者删掉这个文件。


centos7 进程无法kill掉 centos 进程被killed_centos_06


这个时候问题来了,看了几遍,发现每次这个qfigfc文件的路径都不一样,那看来是有什么地方一直在修改这个文件。我先找到他最后一次的位置cat一下看看里面是什么。


centos7 进程无法kill掉 centos 进程被killed_centos_07


cat了发现全是乱码,那没办法了。


centos7 进程无法kill掉 centos 进程被killed_Powered by 金山文档_08


因为刚才有提到,可能有某个地方一直在修改crontab里面的内容,所以我再跑一下netstat -ltnp看看是不是有什么进程在监听端口。


centos7 进程无法kill掉 centos 进程被killed_centos_09


发现有一个nkokya,好像没见过。那待会也把它处理了。

至此,检查的步骤都做完了,开始该删除的删除,该kill的kill就好了。看看都弄好之后,top一下看看kthreaddk这个东西还会不会重新出来,如果没有了,那就弄好了,还有回头记得检查一下安全组等策略是不是有没设置好的,没用的端口就关掉。

最后处理好之后,cpu就降下来了,观察一段时间好像也没有重新再出来了,那应该就是处理好了。


centos7 进程无法kill掉 centos 进程被killed_centos7 进程无法kill掉_10


最后,总结一下整个思路吧:

先检查:

  1. top查看进程,看一下有没有没见过的,没印象的进程占用了较多资源;
  2. 拿到pid,systemctl status [pid] 查看一下有没有守护进程;
  3. 如果有守护进程,进入守护进程的位置看一下有什么奇怪的文件;
  4. 进入/etc/文件夹下,分别查看cron.daily、cron.hourly、cron.monthly、cron.weekly这几个定时器文件夹里面有没有什么奇怪的文件;
  5. crontab -l看看有什么定时任务;
  6. 跑一下netstat -ltnp看看是不是有什么进程在监听端口。

再处理:

  1. 把在监听端口的进程kill掉,因为有可能是这个进程一直在写入我们的定时任务;
  2. 跑一下crontab -e把内容删掉,这个时候先等一段时间,看看还会不会重新写入,如果没有重新写入,那等于第一步的那个一直写入定时器的进程我们是猜对了;如果还在继续写入,那还得继续找。
  3. kill掉kthreaddk这个进程;
  4. 把守护进程里面奇怪的文件也删掉;

最后观察:

  1. 观察crontab还有没有一直被覆盖写入;
  2. 观察kthreaddk进程有没有再重复出现;

附:

kthreadd是Linux的2号进程,是root用户的,检查进程的时候要看清楚名字,这个不是病毒进程哦。