今天早上来到公司,第一件事就是打开监控看下情况。一看吓死人,几乎所有的服务器负载全部跑到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 或者死循环的时候,直接后台执行一次就可以了,不用加到定时任务,否则会照成不必要的麻烦。脚本已经被删除,无法展示。
时间: 2024-10-29 00:46:12