(2)示例2
在實際工作當(dāng)中,服務(wù)器上的服務(wù)經(jīng)常會宕機(jī),拿apache服務(wù)來舉例,如果我們對服務(wù)器監(jiān)控不好,就會造成服務(wù)器中服務(wù)中斷了,而管理員卻不知道的情況。發(fā)現(xiàn)后等到管理員的介入,也會有一定時間的延遲。這時我們就可以寫一個腳本來監(jiān)聽本機(jī)的服務(wù),如果服務(wù)停止或宕機(jī)了,可以自動重啟這些服務(wù)。
我們就以apache服務(wù)來舉例:
前提,我們通過RPM包的方式安裝了apache服務(wù),并啟動,如下圖:

方式一:
分析該腳本該如何實現(xiàn):
思路:把80端口截取出來,賦值到一個變量中,
判斷該變量的值是否為80,是則記錄日志,不是則執(zhí)行啟動apache服務(wù)。
開始編寫:
創(chuàng)建文件if3.sh:
#!/bin/bash
# 判斷apache服務(wù)是否啟動,如果沒有啟動則自動啟動。
# 1.把80端口截取出來,賦值到一個變量中
port=$(netstat -tuln | awk '{print $4}' | grep ":80$")
# 2.判斷port變量是否為空
if[ "$port" == "" ]
then
# 為空則證明apache服務(wù)沒有啟動
# 發(fā)送郵件
echo "apache httpd is down,must restart!"
# 啟動apache服務(wù)
/etc/rc.d/init.d/httpd start &>/deb/null
# 這里不建議使用service的方式啟動apache服務(wù),
# service啟動服務(wù)是一種快捷方式,
# 有可能在腳本中會出問題,這里需要注意一下。
else
# 不為空則證明apache服務(wù)以啟動
# 可以記錄日志
echo "apache httpd is ok."
fi
注意:
不能通過
grep "80"命令來過濾數(shù)據(jù),因為Shell中的正則表達(dá)式是包含匹配,像808、8080等這樣的內(nèi)容,都會被匹配出來。
使用該腳本:
- 執(zhí)行
chmod 755 if3.sh命令,將if3.sh變成可執(zhí)行文件。 - 執(zhí)行
netstat -tuln,查看此時apache服務(wù)是否啟動。
-
執(zhí)行
./if3.sh命令,執(zhí)行腳本文件,檢查到apache服務(wù)是啟動狀態(tài)
-
此時關(guān)掉apache服務(wù)。
再查看一下80端口是否已關(guān)閉。
- 然后在執(zhí)行
if3.sh腳本文件
可以看到執(zhí)行if3.sh腳本文件,發(fā)現(xiàn)apache服務(wù)沒有啟動,
該腳本會自動啟動apache服務(wù)。
-
最后我們再查看一下apache服務(wù)是否啟動。
又重新啟動了。
提示:
腳本執(zhí)行過程中,發(fā)現(xiàn)服務(wù)未啟動,會通知管理員,同時也可以通過命令直接把apache服務(wù)進(jìn)行重新啟動。而不需要管理員來了,才重啟服務(wù)。只要管理員接收到通知服務(wù)器有問題,過來檢查什么原因就可以了。
方式二:
上面實現(xiàn)的方式,基本能夠?qū)崿F(xiàn)檢測apache服務(wù)的需求。
但是實際工作環(huán)境中,可能有種情況,比如apache服務(wù)正常,80端口也被開啟,但是此時的訪問人數(shù)過多,把apache服務(wù)直接擠爆了。也就是說進(jìn)程在,端口也在(卡死),但是apache服務(wù)已經(jīng)不應(yīng)答了。這個時候我們還通過檢查80端口的方式,我們是無法發(fā)現(xiàn)服務(wù)器中apache服務(wù)的問題的。
我們先學(xué)習(xí)一個命令:
nmap命令是端口掃描命令,命令格式如下:
[root@localhost ~]# nmap -sT 域名或 IP
選項:
-s:掃描。
-T:掃描所有開啟的TCP端口。
nmap命令的原理是客戶端(nmap)給一個服務(wù)器所有的端口發(fā)送信息,看都有那些端口回復(fù)信息,回復(fù)了證明該服務(wù)器上的端口上的程序正常。
唯一的問題是nmap命令掃描的時間比較長。
如果你的Linux系統(tǒng)中沒有安裝nmap命令,可以執(zhí)行命令yum -y install nmap進(jìn)行安裝。
nmap命令來掃描本機(jī)的端口,執(zhí)行結(jié)果如下:
[root@localhost tmp]# nmap -sT 192.168.37.128
Starting Nmap 5.51 ( http://nmap.org ) at 2020-10-19 00:18 CST
Nmap scan report for 192.168.37.128 (192.168.37.128)
Host is up (0.0019s latency).
Not shown: 998 closed ports
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http (apache的狀態(tài)是open)
111/tcp open rpcbind
Nmap done: 1 IP address (1 host up) scanned in 0.16 seconds
知道了nmap命令的用法,我們在腳本中使用的命令就是為了截取http的狀態(tài),只要狀態(tài)是“open”
就證明apache啟動正常,否則證明apache服務(wù)啟動錯誤。
開始編寫腳本:
#!/bin/bash
# 判斷apache服務(wù)是否啟動,如果沒有啟動則自動啟動
# 使用nmap命令掃描服務(wù)器,并截取apache服務(wù)的狀態(tài),賦予變量stat。
# 只有apache服務(wù)的進(jìn)程名叫`http`
# 截取第二列是獲取nmap掃描后的端口狀態(tài)
stat=$(map -sT 192.168.37.128 | grep tcp | grep ssh | awk '{print $2}')
# 如果變量stat的值是“open”
if[ "$port"=="open" ]
then
# 則證明apache服務(wù)正常啟動,在正常日志中寫入一句話即可
echo "$(date) httpd is ok!" >> /tmp/autostart-acc.log
else
# 否則證明apache服務(wù)沒有啟動,自動啟動apache服務(wù)
/etc/rc.d/init.d/httpd start &>/dev/null
# 并在錯誤日志中記錄自動啟動apche服務(wù)的時間
echo "$(date) restart httpd??!" >> /tmp/autostart-err.1og
fi
(當(dāng)然實際工作中處理該類問題有監(jiān)控服務(wù)器來進(jìn)行監(jiān)控,以上只是一個練習(xí)。)





