歡迎您光臨本站 註冊首頁

shell腳本實現系統監視統計與數據備份

←手機掃碼閱讀     火星人 @ 2014-03-09 , reply:0

知識內容:
*管理統計信息
*執行備份
*管理用戶
對於linux SA來說,沒啥比shell腳本編程更有用的了.linux系統每天都有很多任務需要做好,從監視系統

磁碟空間、系統用戶到備份系統重要文件.通過shell腳本可以是的工作變得非常輕鬆和高效!
1、監視系統統計信息
確保系統的正常運行是linux SA的核心任務之一,這就需要通過創建shell腳本來監視多種不同的系統的統計
信息,甚至不需要人工干預、半夜三更執行系統腳本.
1.1、必須函數
要自動監視系統的磁碟空間,要使用可以顯示磁碟空間使用情況的命令df:
[root@wzp ~]# df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda3 7033724 4463456 2207200 67% /
/dev/sda1 101086 11301 84566 12% /boot
tmpfs 257700 0 257700 0% /dev/shm
這裡頭我主要提取根目錄磁碟使用率即可,即67%這個數據.
這樣一來,我們就需要使用shell來靈活提取這個數據了:
我們必須把第二行提取出來,之後再提取67%這個數據,我們一步一步來分析.
由於磁碟空間使用情況的數據都是變化的,唯獨不變的就是文件系統/dev/sda3和的/,我們有兩種
方式提取出這一行:
[root@wzp ~]# df | sed -n '//dev/sda3/p'


/dev/sda3 7033724 4463456 2207200 67% /
要知道,對於正斜杠需要通過轉義的,把含有/dev/sda3文本匹配行輸出到STDOUT
[root@wzp ~]# df | sed -n '//$/p'
/dev/sda3 7033724 4463456 2207200 67% /
我們知道這一行唯獨以根(/)符號結尾,可以把以根(/)符號結尾的行提取出來
通過如上任意一種方法,我們都做好了第一步的準備,接著就是把67%提取出來,要知道,這個67的數據可以一直處於改變之中,不可以使用67這個關鍵數據.很明顯,對於這個數據放置第五位,通過$5很容易就把數據提取出來了:
[root@wzp ~]# df | sed -n '//$/p' | gawk '{print $5}'
67%
[root@wzp ~]# df | sed -n '//dev/sda3/p' | gawk '{print $5}'
67%
通過借用gawk把第五位置的數據提取,到了這裡應該不難處理了,就是去掉%符號:
[root@wzp ~]# df | sed -n '//$/p' | gawk '{print $5}' | sed 's/%//'
67
[root@wzp ~]# df | sed -n '//dev/sda3/p' | gawk '{print $5}' | sed 's/%//'
67
OK了,到這裡已經實現了我們的要求,可以動態提取根目錄磁碟使用情況了.
1.2、創建腳本
上面已經知道如何獲取磁碟空間使用情況數據,接下來就是創建腳本了

  1. [root@wzp ~]# cat diskmonitor
  2. #!/bin/bash
  3. # monitor available disk space
  4. space

    =`df | sed -n '//dev/sda3/p' | gawk '{print $5}' | sed 's/%//'`
  5. if [ $space -gt 90 ];then
  6. echo "Disk space on root at $space% used" | mail -s "Disk warning"
  7. else
  8. echo "The disk space is used $space%" | mail -s "Disk space is enought"
  9. fi

通過此腳本實現當根目錄磁碟使用率超過90%的時候自動發報警郵件信息給root
1.3、運行腳本
[root@wzp ~]# chmod x diskmonitor
通過給腳本賦予執行許可權,然後借用crontab計劃任務實現腳本定時運行
[root@wzp ~]# crontab -l
30 0,12 * * * /root/diskmonitor
實現腳本每天凌晨12點30分和中午12點30分分別執行一次腳本

2、監控磁碟資源
2.1、必須函數
如果說linux伺服器上有許多用戶,特別是一些文件伺服器(ftp、samba),就必須對磁碟資源做好監控.
默認情況下,系統用戶一般只對自家目錄有存放資源的許可權,就必須對/home目錄下做數據統計:
可以聯想到的命令應該是du了:
[root@wzp ~]# du -s /home/*
7100 /home/51cto
18684 /home/mysql
90236 /home/www
通過du命令可以很清楚的了解到各個用戶自家目錄磁碟使用情況(前面的數據單位是KB)
如果說/home目錄下有lost found的話可以通過grep -v lost found來過濾掉.
接下來我們主要是提取數據和用戶名,也就是說可以把/home/給去掉,做法很簡單:


[root@wzp ~]# du -s /home/* | sed 's//home///'
7100 51cto
18684 mysql
90236 www
為了更好的顯示磁碟資源使用情況的報表,可以先對數據結果做一個排序:
[root@wzp ~]# du -s /home/* | sed 's//home///' | sort -g -r
90236 www
18684 mysql
7100 51cto
通過sort -g -r(-g表示將所有數據排序;-r表示按照降序排序)實現所佔磁碟空間從大到小排序.對了,還有一條就是所有用戶所佔磁碟總量:
[root@wzp ~]# du -s /home
116028 /home
2.2、創建腳本
通過借用臨時目錄創建的臨時文件,將數據報表以頭部、報告主體、尾部的形式顯示:

  1. [root@wzp ~]# cat diskuse
  2. #!/bin/bash
  3. # calculate disk usage and report per user
  4. TEMP=`mktemp -t tmp.XXXXXX`
  5. du -s /home/* | sed 's//home///' | sort -g -r > $TEMP
  6. total=`du -s /home | gawk '{print $1}'`
  7. cat $TEMP | gawk -v n="$total" '
  8. BEGIN {
  9. print "total disk usage by user";
  10. print "usertspacetpercent"
  11. }
  12. {
  13. printf "%st%dt%6.2f%n", $2, $1, ($1/n)*100

  14. }
  15. END {
  16. print "-------------------";
  17. printf "totalt%dn", n
  18. }'
  19. rm -f $temp
  20. [root@wzp ~]# ./diskuse
  21. total disk usage by user
  22. user space percent
  23. www 90236 77.77%
  24. mysql 18684 16.10%
  25. 51cto 7100 6.12%
  26. -------------------
  27. total 116028

3、監視CPU和內存使用情況
通過編寫shell腳本實現對PU和內存使用情況的監控
3.1、必需函數
linux下有幾個命令可以從系統中提取出CPU或內存的使用情況,如top、uptime、free等
[root@wzp ~]# uptime
12:45:02 up 1:29, 1 user, load average: 0.00, 0.00, 0.00
uptime命令可以給出一些信息點:
* 當前時間
* 系統已經運行的時間
* 當前已經登錄到系統的用戶個數
* 1、5和15分鐘的系統負載平均值
另一個提取系統信息的命令vmstat:
[root@wzp ~]# vmstat
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 0 419176 22980 46652 0 0 23 5 554 16 0 1 98 1 0
如上顯示為上次重新引導的平均值,如果要獲取當前統計信息,可以使用vmstat 1 2 :
[root@wzp ~]# vmstat 1 2


procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 0 419176 22980 46652 0 0 23 5 554 16 0 1 98 1 0
0 0 0 419176 22980 46652 0 0 0 0 1064 16 0 0 100 0 0
第二行包含linux系統的當前統計信息,如果是vmstat 1則一直動態顯示系統當前信息.
對於如上的符號做一個簡單介紹:
r: 等待CPU時間的進程數
b: 不間斷休眠中的進程數
swpd: 使用的虛擬內存量(以MB為單位)
free: 未使用的物理內存量(以MB為單位)
buff: 用作緩存空間的內存量(以MB為單位)
cache: 用作高速緩存空間的內存量(以MB為單位)
si: 從磁碟交換的內存量(以MB為單位)
so: 交換到磁碟的內存量(以MB為單位)
bi: 從塊設備收到的塊數
bo: 發送到塊設備的塊數
in: 每秒CPU的中斷數
cs: 每秒CPU的上下文交換數
us: CPU消耗在運行非內核代碼上的時間百分比
sy: CPU消耗在運行內核代碼上的時間百分比
id: CPU空間的時間百分比
wa: CPU消耗的在等待I/O上的時間百分比
st: 從虛擬機竊取的CPU時間百分比
接下來通過vmstat 1 2 和 uptime命令,從中提取相關參數來編寫獲取數據的腳本:

  1. [root@wzp ~]# touch capstats
  2. [root@wzp ~]# cat capstats
  3. #!/bin/bash
  4. # script to capture system statistics
  5. OUTFILE=/root/capstats.csv
  6. DATE=`date %Y/%d/%m`
  7. TIME=`date %k:%M:%S`
  8. TIMEOUT=`uptime`
  9. USERS=`echo $TIMEOUT | gawk '{print $4}'`
  10. LOAD=`echo $TIMEOUT | gawk '{print $9}' | sed 's/,//'`
  11. FREE=`vmstat 1 2 | sed -n '4p' | gawk '{print $4}'`
  12. IDLE=`vmstat 1 2 | sed -n '4p' | gawk '{print $15}'`
  13. echo "$DATE,$TIME,$USERS,$LOAD,$FREE,$IDLE" >> $OUTFILE

如上腳本主要提取vmstat 1 2 和 uptime命令中的相關數據,還有系統的當前時間
[root@wzp ~]# date %Y/%d/%m
2011/11/05
[root@wzp ~]# date %k:%M:%S
22:15:47
如上通過date命令來獲取時間,具體時間的格式可以通過date --help來了解
echo $TIMEOUT | gawk '{print $4}'可以獲取當前登錄到系統的用戶個數
echo $TIMEOUT | gawk '{print $9}' | sed 's/,//'可以獲取當前系統5分鐘內的平均負載
vmstat 1 2 | sed -n '4p' | gawk '{print $15}'可以獲取系統未使用的物理內存量
vmstat 1 2 | sed -n '4p' | gawk '{print $15}'可以獲取系統CPU空間的時間百分比
然後把獲取到的數據重定向到/root/capstats.csv中,實現對系統CPU和內存使用情況的獲取
然後賦予腳本可執行 許可權:
[root@wzp ~]# chmod x capstats
通過計劃任務實現系統每分鐘獲取一次數據:


[root@wzp ~]# crontab -l
*/1 * * * * /root/capstats
[root@wzp ~]# cat capstats.csv
2011/11/05,22:10:01,2,0.01,319224,92
2011/11/05,22:11:01,2,0.00,319100,98
2011/11/05,22:12:01,2,0.00,319224,99
2011/11/05,22:13:01,2,0.00,319100,99
......
可以看到該文件一直收集著系統CPU和內存使用情況的數據.
3.2、生成報告腳本
上面已經通過腳本capstats生成了數據文件capstats.csv,接下來就是通過這個數據文件capstats.csv來生

成index.html頁面了,這裡頭就需要一點html基礎了,看如下腳本:

  1. [root@wzp ~]# cat report
  2. #!/bin/bash
  3. # parse capstats data into daily report
  4. FILE=/root/capstats.csv
  5. TEMP=/usr/local/nginx/server4/index.html
  6. DATE=`date "%A, %B %d, %Y"`
  7. echo "<html><body><h3>Report for $DATE</h3>" > $TEMP
  8. echo "<table border

    ="1">" >> $TEMP
  9. echo "<tr><td>Date</td><td>Time</td><td>Users</td>" >> $TEMP
  10. echo "<td>Load</td><td>Free Memory</td><td>%CPU idle</td></tr>" >> $TEMP
  11. cat $FILE | gawk -F, '{
  12. printf "

    <tr><td>%s</td><td>%s</td><td>%s</td>", $1, $2, $3;
  13. printf "<td>%s</td><td>%s</td><td>%s</td>n</tr>n", $4, $5, $6;
  14. }' >> $TEMP
  15. echo "</table></body></html>

    " >> $TEMP

通過該腳本把從capstats.csv收集到的數據處理成靜態頁面,然後通過Nginx服務來預覽.
[root@wzp ~]# date "%A, %B %d, %Y"
Thursday, May 12, 2011
這裡點跟上面一致,獲取指定格式的當前日期.
對於echo部分,主要就是生成靜態頁面的標準格式,對於這部分:
cat $FILE | gawk -F, '{
printf "<tr><td>%s</td><td>%s</td><td>%s</td>", $1, $2, $3;
printf "<td>%s</td><td>%s</td><td>%s</td>n</tr>n", $4, $5, $6;
}' >> $TEMP
這是最為關鍵的地方,表示從數據文件capstats.csv中提取數據,然後把$1,$2,$3,$4,$5,$6逐一替代指定位

置的%s,實際上這兩行可以寫成一行的!
再往下就是通過計劃任務實現每15分鐘處理一次數據,然後生成靜態頁面,即可用瀏覽器預覽了.
[root@wzp ~]# crontab -l
*/15 * * * * /root/report
再者啟動Nginx服務:
[root@wzp ~]# /usr/local/nginx/sbin/nginx
然後通過瀏覽器瀏覽,在linux下:
[root@wzp ~]# links
http://110.65.97.106/


即可看到生成的關於系統性能的數據.

4、執行備份
備份本身是一個很大的概念,涉及到的東西也是非常多.對於這一部分內容僅僅對系統文件的備份,主要通
過腳本實現對系統文件的自動化增量備份.還有一個就是將備份文件依舊放置原系統磁碟文件上,簡單實現防止文件被破壞或意外刪除的風險.
4.1、必需函數
在linux下,歸檔數據時最常用的命令是tar,對其具體的用法可以tar --help了解,下面舉個例子:
[root@wzp ~]# du -s backdir/
744 backdir/
[root@wzp ~]# tar -cf back.tar backdir/
[root@wzp ~]# ll back.tar
-rw-r--r-- 1 root root 757760 May 12 21:30 back.tar
如上把backdir目錄歸檔成一個.tar壓縮文件
接下來就是要對生成的歸檔文件做數據壓縮了,linux下常用的gzip命令
[root@wzp ~]# gzip back.tar
[root@wzp ~]# ll back
backdir/ back.tar.gz
[root@wzp ~]# ll back.tar.gz
-rw-r--r-- 1 root root 748514 May 12 21:30 back.tar.gz
通過如上的tar和gzip命令實現對一個目錄做了歸檔和數據壓縮,最終形成.tar.gz後綴的壓縮文件對於.tar.gz後綴的壓縮文件可以通過tar zxvf解壓縮
(z表解壓gz包;x表解壓縮;v表顯示過程;f表解壓文件;-C表解壓到指定的目錄下)
[root@wzp ~]# tar zxvf back.tar.gz -C /home/www/


backdir/
backdir/imagick-3.0.0.tgz
backdir/nginx-1.0.0.tar.gz
[root@wzp ~]# du -s /home/www/backdir/
744 /home/www/backdir/
通過上面實現歸檔數據和壓縮的方法,往下就可以編寫腳本實現自動化了
4.2、創建日常歸檔腳本

  1. [root@wzp ~]# cat backupscript
  2. #!/bin/bash
  3. # archive a working directory
  4. DAY=`date %d`
  5. MONTH=`date %m`
  6. TIME=`date %H%M`
  7. SOURCE=/root/etc/httpd
  8. DESTDIR=/tmp
  9. mkdir -p $DESTDIR/$MONTH/$DAY
  10. DESTINATION=$DESTDIR/$MONTH/$DAY/archive$TIME
  11. tar -czvPf $DESTDIR/$MONTH/$DAY/archive$TIME.tar.gz $SOURCE

對於如上腳本,主要實現把/root/etc/httpd該目錄進行定期的壓縮備份,並且通過指定具體時間的目錄名稱

,方便後期的數據整理和查看.
[root@wzp ~]# chmod x backupscript
[root@wzp ~]# ./backupscript
/root/etc/httpd/
/root/etc/httpd/logs
/root/etc/httpd/conf/
/root/etc/httpd/conf/httpd.conf
/root/etc/httpd/conf/magic
/root/etc/httpd/run
/root/etc/httpd/conf.d/
/root/etc/httpd/conf.d/README
/root/etc/httpd/conf.d/proxy_ajp.conf
/root/etc/httpd/conf.d/welcome.conf


/root/etc/httpd/conf.d/python.conf
/root/etc/httpd/conf.d/php.conf
/root/etc/httpd/conf.d/perl.conf
/root/etc/httpd/conf.d/manual.conf
/root/etc/httpd/conf.d/squid.conf
/root/etc/httpd/conf.d/webalizer.conf
/root/etc/httpd/conf.d/ssl.conf
/root/etc/httpd/modules
如果不顯示歸檔過程可以把-v去掉.
[root@wzp ~]# date
Mon May 16 13:39:10 CST 2011
[root@wzp ~]# ll /tmp/05/16/
total 48
-rw-r--r-- 1 root root 47805 May 16 13:39 archive1339.tar.gz
由此我們可以很方便的通過日期尋找指定時間的備份文件
接下來對該備份文件進行解壓:
[root@wzp 16]# pwd
/tmp/05/16
[root@wzp 16]# tar zxvf archive1339.tar.gz
/root/etc/httpd/
tar: Removing leading `/' from member names
/root/etc/httpd/logs
/root/etc/httpd/conf/
/root/etc/httpd/conf/httpd.conf
/root/etc/httpd/conf/magic
/root/etc/httpd/archive1333.tar.gz
/root/etc/httpd/run
/root/etc/httpd/conf.d/
/root/etc/httpd/conf.d/README
/root/etc/httpd/conf.d/proxy_ajp.conf
/root/etc/httpd/conf.d/welcome.conf
/root/etc/httpd/conf.d/python.conf
/root/etc/httpd/conf.d/php.conf
/root/etc/httpd/conf.d/perl.conf
/root/etc/httpd/conf.d/manual.conf
/root/etc/httpd/conf.d/squid.conf
/root/etc/httpd/conf.d/webalizer.conf
/root/etc/httpd/conf.d/ssl.conf
/root/etc/httpd/modules
這裡你會發現出現了一行報錯信息:
tar: Removing leading `/' from member names
說是移除了/,不過之這麼做主要是為了安全起見(理解不了就百度)
對於備份文件需要解壓回來使用的時候,會放置於原來的位置而覆蓋原目錄下所有內容.通過拿掉根目

錄是的壓縮后採用了相對路徑,避免舊的文件覆蓋的新的文件
[root@wzp 16]# ll
total 52
-rw-r--r-- 1 root root 47805 May 16 13:39 archive1339.tar.gz
drwxr-xr-x 3 root root 4096 May 16 13:40 root
從這裡我們也看到了我們備份的原目錄是/root/etc/httpd
解壓后被去掉了第一個/就變成了root
[root@wzp 16]# tree root/
root/
`-- etc
`-- httpd
|-- archive1333.tar.gz
|-- conf
| |-- httpd.conf
| `-- magic
|-- conf.d
| |-- README
| |-- manual.conf
| |-- perl.conf
| |-- php.conf
| |-- proxy_ajp.conf
| |-- python.conf
| |-- squid.conf
| |-- ssl.conf
| |-- webalizer.conf
| `-- welcome.conf
|-- logs -> ../../var/log/httpd
|-- modules -> ../../usr/lib/httpd/modules
`-- run -> ../../var/run

4 directories, 16 files

[root@wzp 16]# du -s root/etc/httpd/
112 root/etc/httpd/
[root@wzp 16]# du -s /root/etc/httpd/
112 /root/etc/httpd/
原文件和解壓后的文件大小內容完全一致
就是通過cron實現該腳本的定期運行實現指定的數據的backup了!!

本文出自 「twenty_four」 博客,請務必保留此出處http://twentyfour.blog.51cto.com/945260/566391


[火星人 ] shell腳本實現系統監視統計與數據備份已經有875次圍觀

http://coctec.com/docs/linux/show-post-48637.html