知識內容:
*管理統計信息
*執行備份
*管理用戶
對於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'
- [root@wzp ~]# cat diskmonitor
- #!/bin/bash
- # monitor available disk space
- space =`df | sed -n '//dev/sda3/p' | gawk '{print $5}' | sed 's/%//'`
- if [ $space -gt 90 ];then
- echo "Disk space on root at $space% used" | mail -s "Disk warning"
- else
- echo "The disk space is used $space%" | mail -s "Disk space is enought"
- 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 ~]# cat diskuse
- #!/bin/bash
- # calculate disk usage and report per user
- TEMP=`mktemp -t tmp.XXXXXX`
- du -s /home/* | sed 's//home///' | sort -g -r > $TEMP
- total=`du -s /home | gawk '{print $1}'`
- cat $TEMP | gawk -v n="$total" '
- BEGIN {
- print "total disk usage by user";
- print "usertspacetpercent"
- }
- {
- printf "%st%dt%6.2f%n", $2, $1, ($1/n)*100
- }
- END {
- print "-------------------";
- printf "totalt%dn", n
- }'
- rm -f $temp
- [root@wzp ~]# ./diskuse
- total disk usage by user
- user space percent
- www 90236 77.77%
- mysql 18684 16.10%
- 51cto 7100 6.12%
- -------------------
- 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
- [root@wzp ~]# touch capstats
- [root@wzp ~]# cat capstats
- #!/bin/bash
- # script to capture system statistics
- OUTFILE=/root/capstats.csv
- DATE=`date %Y/%d/%m`
- TIME=`date %k:%M:%S`
- TIMEOUT=`uptime`
- USERS=`echo $TIMEOUT | gawk '{print $4}'`
- LOAD=`echo $TIMEOUT | gawk '{print $9}' | sed 's/,//'`
- FREE=`vmstat 1 2 | sed -n '4p' | gawk '{print $4}'`
- IDLE=`vmstat 1 2 | sed -n '4p' | gawk '{print $15}'`
- 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
通過計劃任務實現系統每分鐘獲取一次數據:
成index.html頁面了,這裡頭就需要一點html基礎了,看如下腳本:
- [root@wzp ~]# cat report
- #!/bin/bash
- # parse capstats data into daily report
- FILE=/root/capstats.csv
- TEMP=/usr/local/nginx/server4/index.html
- DATE=`date "%A, %B %d, %Y"`
- echo "<html><body><h3>Report for $DATE</h3>" > $TEMP
- echo "<table border ="1">" >> $TEMP
- echo "<tr><td>Date</td><td>Time</td><td>Users</td>" >> $TEMP
- echo "<td>Load</td><td>Free Memory</td><td>%CPU idle</td></tr>" >> $TEMP
- 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
- 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/
- [root@wzp ~]# cat backupscript
- #!/bin/bash
- # archive a working directory
- DAY=`date %d`
- MONTH=`date %m`
- TIME=`date %H%M`
- SOURCE=/root/etc/httpd
- DESTDIR=/tmp
- mkdir -p $DESTDIR/$MONTH/$DAY
- DESTINATION=$DESTDIR/$MONTH/$DAY/archive$TIME
- 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@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腳本實現系統監視統計與數據備份已經有883次圍觀