【現(xiàn)學(xué)現(xiàn)忘&Shell流程控制】— 43.if語句(3)

(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í)。)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容