一,Python簡介
二,監控基本原理
三,監控框架代碼分析
四,監控源代碼分析
五, 文章總結有福利
為什么要腳本監控呢,這是個非常嚴重需要注意的問題,為什么需要一個腳本監控,
因為腳本監控是服務器的進程,
如果寫代碼不夠健壯,他運行十幾天二十幾天他突然蹦了,怎么辦如果這時候有一個腳本去監控服務進程就可以節省自己很多時間,
一,Python簡介
Python是近年來最火的一個熱點,沒有之一。從性質上來講它和我們熟知的C、JAVA、php等沒有什么本質的區別,也是一種開發語言,而且已經進階到主流的二十多種開發語言的top 5(數據源自最新的TIOBE排行榜)。
Python 是一個高層次的結合了解釋性、編譯性、互動性和面向對象的腳本語言,具有很強的可讀性,相比其他語言經常使用英文關鍵字,其他語言的一些標點符號,它具有比其他語言更有特色語法結構。
優點
1.“優雅”、“明確”、“簡單”- 所以Python程序看上去總是簡單易懂,
2. 開發效率高- Python有非常強大的第三方庫,基本上你想通過計算機實現任何功能,Python官方庫里都有相應的模塊進行支持,直接下載調用后,在基礎庫的基礎上再進行開發,
3. 高級語言- 當你用Python語言編寫程序的時候,你無需考慮諸如如何管理你的程序使用的內存一類的底層細節
4,如果你需要你的一段關鍵代碼運行得更快或者希望某些算法不公開,你可以把你的部分程序用C或C++編寫,然后在你的Python程序中使用它們。
5. 由于它的開源本質,Python已經被移植在許多平臺上(經過改動使它能夠工 作在不同平臺上)。如果你小心地避免使用依賴于系統的特性,那么你的所有Python程序無需修改就幾乎可以在市場上所有的系統平臺上運行
6. 如果你需要你的一段關鍵代碼運行得更快或者希望某些算法不公開,你可以把你的部分程序用C或C++編寫,然后在你的Python程序中使用它們。
缺點
7. 代碼運行速度慢
8. 發布程序時必須公開源代碼
二,監控基本原理
1. cactio
cacti不是監控工具,他是個依賴于SNMP的數據采集和數據呈現的工具。
數據采集、 保存數據[SQL, txt].
數據展示(rrdtool 繪圖)。
數據分析和報警(很一般)。
2. nagIOS。
功能:數據報警(報警功能是Nagios的特色功能) [ 故障觸發,故障恢復都可以。
依賴分析報警(能自動的識別到關鍵設備的故障,關聯設備不會報警)。
數據采集(采集的數據是弱項,他只關心警戒位,只關心正常與否的狀態,狀態轉換時可以實現報警,所以它采集的數據不需要保存),當然也有插件彌補這個不足,如PNP4Nagios。
3. zabbix (php)(推薦)
Nagiostcacti整合互相彌補不足!I
nagios和 cacti不適合超大規模的監控、由于大規模的帶寬和網絡限制,會導致監控的延遲等問題,所以有很多是 nagios+ cacti整合,但是依然不適合在大規模的環境中,不適合分布式部署, Nagios在大規模中就會出現延遲,失
去 Nagios本事的特色。
那么 zabbix同時整合了 cacti和 Nagios特點的工具,而且還具有了前兩者不具有的工具,支持分布式等等。
4. 補充工具:
netdata:托管在github上的一款類型zabbix的開源監控工具https:/
/github. com/firehol/netdata
open- falcon:小米公司開源的企業級監控工具(python)(推薦)
Ganglia類似于 zabbix,大型分布式監控系統
開源監控工具對比http://www.oschina.net/news/67525/monitoring-tools
5. 監控軟件數據采集的方式
SNMP 協議。
agent 代理的方式去采集數據。
shell 腳本api 接口
6. 數據展示方式
php html App
7. 數據告警
mail,msm,微信,電話,釘釘機器人
三,框架源代碼分析
常見shell

基本結構
- vim file.sh

- chmod +x file.sh #授權
- sh +xv file.sh #調試
- ./file.sh #絕對路徑,執行腳本
基本腳本構成
- 命令
- 變量
- 單一目的的小程序,由shell來解釋命令并告訴kernel;
- set
- -e 這句語句告訴bash如果任何語句的執行結果不是true則應該退出
- -c dir:在讀取 makefile 之前改變到指定的目錄dir;
- 管道
- 重定向
- 退出
命令
- 替換:變量=${變量}、變量=$(命令)、變量=表達式、變量=‘字符串’、變量=值
- 查看:echo $X
- 賦值:expr
- 運算:let、&成功執行命令2、||#失敗執行命令2

if [-n/-z $string] #如果string非空/空,返回True;
if [xx1 -d/-a/-o xx2] #不存在、并列(文件1比文件2新)、或;
[-e/-d/-f/-L/-r/-s/-h FILENAME] #如果FILENAME存在/為目錄/為常規文件/符號鏈接/可讀/長度不為0/軟鏈接,則為真
- 比較:-gt、-lt、-eq
- 處理:#、%、/
- 特殊變量(參數)

- 移動:shift #把變量從參數數組中移除
范圍
seq a b
seq -w b
循環、條件
- for

- if

- while

xpect
例題:
1. 測試一:監控磁盤的使用率,>90%時給root發郵件

2.測試二:寫一個腳本解決DOS攻擊生產案例
提示:根據web日志或者或者網絡連接數,監控當某個IP并發連接數或者短時內PV達到100,即調用防火墻命令封掉對應的IP,監控頻率每隔3分鐘。
法一:
# !/bin/bash
IP=`netstat -nut | awk '{print $5}' | cut -d: -f1 | grep -o '.*[0-9]' | awk '{++ip[$1]}END{for(i in ip)print ip[$1],i}' | sort -n

IP=`netstat -nut | awk '{print $5}' | cut -d: -f1 | grep -o '.*[0-9]' | awk '{++ip[$1]}END{for(i i n ip)print ip[$1],i}' | sort -n | awk '{if($1>1)p rint $2}'`

3. 測試三:查看10.0.0.0/24網段中的在線用戶數;
ping:測試主機間網絡的連通性

22. env CLOUD_MySQL_ENV=test exec /opt/cloud_mysql/bin/uwsgi --die-on-term --ini /opt/cloud_mysql/conf/uwsgi.in

nmap:一款開源的網絡探測器和安全審核工具,它可以快速掃描大型網絡

4. 批量創建文件及改名(不同的系統語法有所不同,此為另一種思路)

15.passwd=`echo $(date+%t%N)$RANDOM|md5sum|cut -c 2-9` #$RANDOM表示內部變量,可以創建隨機數;date+X%設置系統時間格式
16. useradd oldboy$n >&/dev/null&& user_status=$?
17. echo "$passwd"|passwd --stdinoldboy$n >&/dev/null && pass_status=$? #用echo xxx | yyy --stdin zzz,其中xxx為和終端交互內容

python

#當前時間
time.strtime(’%y-%m-%d’)
#磁盤狀態
os.open('df -h ',‘r’).readline()
#表示形態
‘n’.join(xxx)
#寫入數據
f.write(’%s’ % str)、f.flush() 、f.close()
四,監控源代碼分析
1,PS命令查看linux程序進程

2,shell腳本
利用PS命令查看server進程的狀態,如死亡、就重新啟動。做一個死循環輪訓。

30秒去輪詢這個這個進程。死亡就繼續重啟。
3,效果

PS查看進程號,此時procnum = 3 然后用kill 命令殺死進程之后

然后腳本檢測到后,進而重啟。這時server的進程號已經變化。這樣server服務器的進程就完成的死亡重啟的監控。
綜合起來這句指令的意思就是:
以詳細格式查看所有進程,從中選出具有關鍵字 Manipulator 的進程,但是排除掉用于查找的grep自身進程,對于滿足上面條件的結果,統計其行數,也就是看有幾個帶有Manipulator關鍵字的進程,將統計的結果賦值給變量monitor 。
if…then…else…fi : shell腳本里面 if 語句的用法, fi 符號與 if 符號成對使用,表示 if 語句的結束。
if [ $monitor -eq 0 ] : if 語句的判斷用 test 或者 “[ ]” ,符號” $“ 表示取變量的值, -eq表示等于, -gt大于, -lt小于, -ge大于等于,-le小于等于。
echo :用于輸出顯示。

用于運行Manipulator程序。
二、對使用python打開的多個程序的監控
因為知道自己想要監控的程序的具體名字,所以對于這一類程序的監控也可以用上面的方法,但是這一類情況也讓我們思索另一種方法進行監控。
在我的 /home/mk90/Documents/restart_pro 文件夾里有 test.py 和 test2.py 兩個python程序,現在我要看這兩個程序是否已經打開,如果沒有就打開它們。
multi_restart.sh


declare -a Array : 表示聲明了一個數組 Array

這句指令包含的內容較多
pgrep 是通過程序的名字來查詢進程的工具;
sed是一個很好的文件處理工具,本身是一個管道命令,主要是以行為單位進行處理,可以將數據行進行替換、刪除、新增、選取等特定工作,詳細用法可以參考
https://blog.csdn.net/zhushuai1221/article/details/53114178
sed -n 1p : 的作用就是對前面查找的結果,讀取第一行,同樣 sed -n 2p 就是讀取第二行 ;
awk '{print $1}’ : awk命令通常是將所列出的行,根據條件打印出某一列或幾列,這里就是打印以空格為分隔符的第一列(其實也只有一列,因為pgrep命令只輸出進程的pid號;
那么

兩條指令的意思就是,查看名為python的進程,把查到的第一個進程的pid號賦值給Array[0],把第二個賦值給Array[1];
后面的判斷就是只要有進程pid號,說明進程存在,否則進程不存在。

這句代碼的意思就是打開一個新的終端,執行命令 ”python /home/mk90/Documents/restart_pro/test2.py“,執行完畢后該終端保持存在不關閉。
gnome-terminal 是終端的一種,Ubuntu系統的終端就是這種版本, 參數 -x 表示后面出現的都當做命令執行,并且只執行一次;
bash 是防止終端立即關閉,如果輸入:

終端執行后會一閃就關閉,甚至看不到執行的效果;
"-c"選項使shell解釋器從一個字符串中而不是從一個文件中讀取并執行shell命令;
exec bash 使終端運行命令后仍然存在。
缺陷:
用這種方法有一個缺陷,就是需要知道會有幾個python程序以及它們的的順序;如果有兩個的話,操作第二個是正常的,可以重啟,但是如果第一個程序死了,也會重啟第二個程序!!!因為第一個進程中斷之后,系統實時監測,第二個進程變成了最前面的也是唯一的python進程,那么它認為第一個程序還在運行,而第二個程序停止了,所以會重啟第二個程序。
總結;有什么問題和需要相關資料的都可以私信‘資料'兩字可MF領取相關資料,C++、linux,shell,Kali,
首先明白一個前提,我們是發現問題才會告警發郵件通知,那么當告警腳本未加載時,說名當前監控項正常。或者之前出現異常,但是已經恢復。
腳本的目的是防止問題出現,處于修復期的頻繁告警。我們可以定義一個時間閾值,一小時。比如距離上一次問題出現,也就是距離上一次告警的時間大于一小時,我們認為就是一個新的異常,否則就是一個尚未解決的故障。
每次告警,我們都記錄一個絕對時間戳,當下一次告警到來時,用當前時間戳減去上一次報警的時間戳,然后if判斷該差值,從而確定告警動作。
在具體腳本中定義t2為上一次告警時間戳,t1為當前時間戳,t1-t2就是我們要的判斷值。t1可以用命令直接獲取,t1=`date +%s` t2 要從日志中獲取。但是還有一個問題,對于第一次告警,該t2從哪里來了,也簡單,我們自己定義一個滿足新異常條件的時間戳就可以,比如兩小時之前。
對于一個已發現待解決的故障,也就是對應上面時間戳差值小于一小時的情況,如果我們的腳本是一分鐘執行一次,就可以做一個計數器,每發現一次,計數一次,當計數器大于10時,也就是異常持續了10分鐘,這時候發送郵件一次,同時清空計時器。
因為mail.py 腳本決定了發送郵件必須帶三個參數,收件人郵箱,主題, 內容。因此mail.sh 調用mail.py 必須傳遞給它三個參數,那么這三個參數最終來自哪里呢,來自監控項腳本,比如load.sh
傳遞順序為 load.sh---->mail.sh----->mail.py
再解釋mail.sh 第一行,log=$1 , 是一個變量賦值語句,此時的$1就是load.sh 傳遞過來的郵箱名稱。
在程序中我么看到后面將時間戳保存在了/tmp/$log 下面,該復制語句是為了給該日志文件取一個有意義的名稱,便于以后管理。當然可以給出其他賦值,比如log=time.txt