事情經(jīng)過(guò)
昨天早上,打開電腦發(fā)現(xiàn)自己的博客網(wǎng)站打開不了,準(zhǔn)備遠(yuǎn)程登錄服務(wù)器查看問(wèn)題,發(fā)現(xiàn)服務(wù)器遠(yuǎn)程不上。沒(méi)辦法,登錄阿里云后臺(tái),重啟服務(wù)器。重啟完成后,網(wǎng)站能正常打開,所以當(dāng)時(shí)就不以為然,以為阿里云那邊是不是出了什么毛病。
到了下午的時(shí)候,發(fā)現(xiàn)網(wǎng)站又打不開了,而且又遠(yuǎn)程連接不了服務(wù)器。進(jìn)入阿里云控制臺(tái),查看監(jiān)控發(fā)現(xiàn)cpu跑滿了。只能再重啟服務(wù)器,等重啟完成后再遠(yuǎn)程連接上去,這次需要好好排查問(wèn)題。
解決問(wèn)題
當(dāng)時(shí)首先想到的是中病毒了,先不管那么多,第一步是找到那些耗cpu的進(jìn)程殺死。使用top命令,查看耗cpu的進(jìn)程有哪些。一看就明白了,都是bzip2搞得鬼。
殺進(jìn)程的過(guò)程發(fā)現(xiàn)一個(gè)問(wèn)題,就是這些進(jìn)程殺死了,過(guò)一會(huì)又出現(xiàn)了。這種現(xiàn)象,我知道肯定要找到他們的父進(jìn)程,擒賊先擒王。
#?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
但是發(fā)現(xiàn)他們的ppid不是同一個(gè),這就讓我很疑惑了。我打算用進(jìn)程樹看看
pstree?-up
這時(shí)候,我就知道了,原來(lái)是自己的定時(shí)腳本有問(wèn)題。那么我需要做以下幾件事:
-
關(guān)閉crond服務(wù)
-
crontab -e 將weekly.sh去掉
-
殺掉那些耗cpu的進(jìn)程
#?關(guān)閉 [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進(jìn)程,下面的命令執(zhí)行了好幾遍,才將所有耗cpu進(jìn)程全部殺掉了 ps?-lA?|?grep?bzip2?|?awk?'{print?$4}'?|?xargs?-n?10?kill?-9
問(wèn)題原因與思考
剛開始,我以為是自己的shell腳本有問(wèn)題,出現(xiàn)死循環(huán)導(dǎo)致問(wèn)題出現(xiàn)。但是查看腳本,發(fā)現(xiàn)沒(méi)有問(wèn)題,沒(méi)有死循環(huán)的情況出現(xiàn)。一時(shí)間,百思不得姐。
#!/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?{}?;
過(guò)了很長(zhǎng)時(shí)間,終于找到了原因所在,原來(lái)是自己的定時(shí)任務(wù)寫法有問(wèn)題
*?3?*?*?1??/root/bin/weekly.sh?1>/dev/null?2>&1
我原本的想法是每周1凌晨3點(diǎn)執(zhí)行一次備份腳本,但是這樣寫的結(jié)果是每周一凌晨3點(diǎn)的每分鐘都會(huì)執(zhí)行該腳本一次。正確的寫法應(yīng)該如下:
#?每周一凌晨三點(diǎn)零一分執(zhí)行該腳本 1?3?*?*?1??/root/bin/weekly.sh?1>/dev/null?2>&1
問(wèn)題解決了,原因也找到了。自己該寫一個(gè)服務(wù)器資源監(jiān)控腳本了。