首页 > 代码库 > 一次脚本和crond引发的系统故障

一次脚本和crond引发的系统故障

今天早上来到公司,第一件事就是打开监控看下情况。一看吓死人,几乎所有的服务器负载全部跑到1千多,但是我又没有收到邮件报警:(故障如下)

技术分享

排错步骤:

(1)登录其中一台机器。发现负载很正常。而且没有收到邮件。那说明应该就是监控机的问题了。

(2)登录监控机。top命令查看如下:

技术分享

(3)看到下面有很多bash的命令,就应该了解到,应该是某个脚本死循环照成的,先不关心谁写的赶紧解决再说。

(4)查看一下到底是哪个脚本死循环。用ps -ef | grep bash .查看是一个死循环的脚本引起的。(是一个for循环,sleep3秒。主要是一个curl 的脚本检查完整的返回值。)

(5)查看是否有定时任务,因为假如只有一条循环不会造成这么多。简单查看进程,原来是定义了5个星号;怪不得会这么多,因为本来机已经死循环了,再用crontab来执行,那负载高是正常的。

(6)停掉crontab进程./etc/init.d/crond stop.

 (7)执行命令杀掉所有的脚本进程。ps -ef | grep /root/moni | awk ‘{print $2}‘ | xargs kill -9

(8)执行完之后。发现还没有降下来,还有很多的邮件队列,顺便也把所有的邮件进程Kill。

(9)但是还没有发现有效果顺便把脚本直接删除(这步不应该执行。)

(10)发现负载还是很高。再次用top打开查看的时候发现很多僵死进程。

技术分享(11)应该是刚才我强行删除了,邮件的程序和脚本文件,导致进程僵死了,接下来杀死僵死进程。

技术分享(12)慢慢等待之后,系统终于逐渐恢复了:

技术分享

技术分享


总结分析:注意,当我们写for 或者死循环的时候,直接后台执行一次就可以了,不用加到定时任务,否则会照成不必要的麻烦。脚本已经被删除,无法展示。

本文出自 “小罗” 博客,请务必保留此出处http://xiaoluoge.blog.51cto.com/9141967/1595759

一次脚本和crond引发的系统故障