shell編程實戰(zhàn)之監(jiān)控端口(80端口、443端口等)

一般企業(yè)用的服務器上面都會跑各種服務,比如nginx、php、mysql、redis、mongodb等等。一般系統(tǒng)的運行可能會需要多個服務的配合,比如我司的系統(tǒng)需要php、mysql、redis、apache、mongodb服務。這些服務缺一不可。

所以我們要實時監(jiān)控這些服務,如果發(fā)現有服務出現異常,需要立即告警。這里我們不打算通過進程名來判斷服務的狀態(tài)。我們打算通過端口的監(jiān)聽來判斷服務的運行狀態(tài)。

linux服務器上有一個命令可以用來查看端口狀態(tài):netstat。但是在centOS7上,需要先安裝net-tools工具,才有這個命令。已經安裝這個工具包后,我們來使用netstat命令,看看它會顯示哪些信息

#?netstat?-tlnp Active?Internet?connections?(only?servers) Proto?Recv-Q?Send-Q?Local?Address???????????Foreign?Address?????????State???????PID/Program?name???? tcp????????0??????0?127.0.0.1:6379??????????0.0.0.0:*???????????????LISTEN??????11213/redis-server?? tcp????????0??????0?0.0.0.0:80??????????????0.0.0.0:*???????????????LISTEN??????1556/nginx:?master?? tcp????????0??????0?0.0.0.0:22??????????????0.0.0.0:*???????????????LISTEN??????984/sshd???????????? tcp????????0??????0?127.0.0.1:88????????????0.0.0.0:*???????????????LISTEN??????17446/httpd????????? tcp????????0??????0?0.0.0.0:443?????????????0.0.0.0:*???????????????LISTEN??????1556/nginx:?master?? tcp????????0??????0?127.0.0.1:27017?????????0.0.0.0:*???????????????LISTEN??????25859/mongod???????? tcp????????0??????0?0.0.0.0:3306????????????0.0.0.0:*???????????????LISTEN??????7138/mysqld

上面顯示的信息,不管是端口6379的redis,還是3306的mysql等等,都是運行我司系統(tǒng)必須的服務。然后,我們通過grep命令,過濾掉第一行以及第二行

#?netstat?-tlnp?|?grep?tcp tcp????????0??????0?127.0.0.1:6379??????????0.0.0.0:*???????????????LISTEN??????11213/redis-server?? tcp????????0??????0?0.0.0.0:80??????????????0.0.0.0:*???????????????LISTEN??????1556/nginx:?master?? tcp????????0??????0?0.0.0.0:22??????????????0.0.0.0:*???????????????LISTEN??????984/sshd???????????? tcp????????0??????0?127.0.0.1:88????????????0.0.0.0:*???????????????LISTEN??????17446/httpd????????? tcp????????0??????0?0.0.0.0:443?????????????0.0.0.0:*???????????????LISTEN??????1556/nginx:?master?? tcp????????0??????0?127.0.0.1:27017?????????0.0.0.0:*???????????????LISTEN??????25859/mongod???????? tcp????????0??????0?0.0.0.0:3306????????????0.0.0.0:*???????????????LISTEN??????7138/mysqld

然后再通過awk命令獲取第四列的信息。

#?netstat?-tlnp?|?grep?tcp?|?awk?'{print?$4}' 127.0.0.1:6379 0.0.0.0:80 0.0.0.0:22 127.0.0.1:88 0.0.0.0:443 127.0.0.1:27017 0.0.0.0:3306

最后再通過cut命令獲取到端口號。

#?netstat?-tlnp?|?grep?tcp?|?awk?'{print?$4}'?|?cut?-d:?-f2 6379 80 22 88 443 27017 3306

通過上面的操作,我們能獲取目前服務器端口的情況,然后我們將需要運行服務的端口存放在數組中,然后遍歷該數組和拿到的這些信息做對比。

ports="80?88?443?3306?6379?27017"  for?port?in?$ports do ????echo?$port done

遍歷這些需要監(jiān)聽的端口后,我們來將端口與netstat獲取到的信息作對比。我們這里用grep命令來做判斷。下面我們給出完整的代碼:

#!/bin/bash #?監(jiān)控服務器端口情況  export?LANG=en? ports="80?88?443?3306?6379?27017"  netstat_info=$(netstat?-tlnp?|?grep?tcp?|?awk?'{print?$4}'?|?cut?-d:?-f2)  for?port?in?$ports do ????flag=$(echo?$netstat_info?|?grep??$port) ????if?[?-z?"$flag"?];then ????????echo?"$port?is?dead" ????fi done

對于端口監(jiān)控的腳本編寫還是很容易的。下面我們來測試下該腳本是否能正常監(jiān)控端口。所有服務都正常的情況下,執(zhí)行該腳本不會輸出任何信息。如果關閉了nginx服務,則應該出現信息。

首先,所有服務都正常的情況下,執(zhí)行腳本

#?./port.sh? #?#不會有任何信息出現

現在我們來主動關閉nginx服務,然后再來運行該腳本,查看會出現什么信息

#?/etc/init.d/nginx?stop Stoping?nginx...??done #?./port.sh? 80?is?dead 443?is?dead

由此得知,該腳本能正常監(jiān)控服務器端口情況。日常工作中,經常將上述腳本和定時任務以及告警程序一起使用。將此腳本發(fā)到定人任務去,沒分鐘執(zhí)行一次,當發(fā)現指定端口沒有被監(jiān)聽,則觸發(fā)告警程序。

? 版權聲明
THE END
喜歡就支持一下吧
點贊11 分享