shell腳本實例-系統監控


shell腳本監控網站並實現郵件、短信報警
shell進程監控腳本(發送郵件報警)
Shell腳本監控服務器在線狀態和郵件報警的方法

http://www.jbxue.com/jb/shell/

 

11.

#!/bin/bash  
a="/tmp/test.log"  
while [[ -f $a ]];  
do  
sleep 1;  
size=`ls -lrt $a | cut -d " " -f 5`  
echo $size  
if [ $size -ge 1024 ];  
then  
logrotate  /etc/logrotate.conf;  
fi  
done


a="/mnt/fileserver/daq/check"
if [ ! -f $a ]
do
echo "nfs server is donw"|mail -v -s "nfs" createyuan@sohu.com createyuan1@163.com 403185951@qq.com
fi


http://blog.csdn.net/gujing001/article/details/7110589	 Shell處理字符串常用方法 

 

10.

請輸入要連接的主機

    #!/bin/bash  
    #written by wubo  
    #blog:blog.csdn.net/wbls615117  
    while :  
    do  
    echo "請輸入你要進行的操作:"  
    select var in "edit file" "view ip" "delete file" "change directory" "exit" "view directory"  
    do   
    break  
    done  
    case $var in  
    "edit file")  
        echo -n "please input edit file:"  
        read file  
        vim $file  
        echo '編輯文件成功'  
        ;;  
    "view ip")  
        echo -n "please input device name:"  
        read file  
        ifconfig $file  
        echo '顯示IP地址成功'  
        ;;  
    "delete file")  
        echo -n "please input delete file:"  
        read file  
        rm -rf $file      
        echo '成功刪除文件'  
        ;;  
    "change directory")  
        echo -n "please input change directory:"  
        read file  
        cd $file  
        echo  "當前目錄為:$(pwd)"  
        ;;  
    "view directory")  
        echo -n "please input a directory:"  
        read file  
        ls $file  
        echo "目錄瀏覽成功"  
        ;;  
    "exit")  
        break  
        echo '退出成功'  
        ;;  
    *)  
        break  
        echo '退出成功'  
        ;;  
    esac  
    done  

 

9.

#!/bin/bash
IP=`ifconfig eth0 | grep "inet addr" | cut -f 2 -d ":" | cut -f 1 -d " "`
tomcat_dir="/opt/apache-tomcat-7.0.8"
mysql_dir="/usr/local/mysql/bin/mysqld_safe"
vsftp_dir="/usr/sbin/vsftpd"
ssh_dir="/usr/sbin/sshd"
for dir in $tomcat_dir $mysql_dir $vsftp_dir  $ssh_dir 
do
process_count=$(ps -ef | grep "$dir" | grep -v grep | wc -l)
        for service in tomcat mysql vsftp ssh 
        do
                echo "$dir" |grep -q "$service"
                if [ $? -eq 0 ]
                then
                        if [ $process_count -eq 0 ]
                        then
                            echo "$service is down at $(date +%Y%m%d%H:%M:%S)" >>/usr/monitor/process/process_$(date +%Y%m%d).log
                            echo "$service is down at $(date +%Y%m%d%H:%M:%S)" | mail -s "$IP服務器 $service服務關閉告警" XXXX@qq.com
                        else
                            echo "$service is running at $(date +%Y%m%d%H:%M:%S)" >>/usr/monitor/process/process_$(date +%Y%m%d).log
                        fi
                else
                        continue
                fi
        done
done

 

8.監控日志特定內容

# cat cpu_bug_monitor.sh
#!/bin/bash
grep "BUG: soft lockup - CPU#" /var/log/messages
        if [ $? -eq 0 ] ; then
                counter=`grep "BUG: soft lockup - CPU#" /var/log/messages | wc -l `
                echo "`date` ## CPU BUG: $counter times" | mutt -s "CPU BUG" 1397710****@139.com
                echo "`date` ## CPU BUG: $counter times" >> /tmp/CPU_BUG_STATUS
        else
                echo "`date` ## Check CPU BUG normal" >> /tmp/CPU_BUG_STATUS
        fi

一旦發現日志中出現"BUG: soft lockup - CPU#"將統計次數並發送到1397710****@139.com郵箱。如果正常就記錄檢查時間和結果到/tmp/CPU_BUG_STATUS。

 

 

7.base64bash實現

base64Table=(A B C D E F G H I J K L M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n o p q r s t u v w x y z 0 1 2 3 4 5 6 7 8 9 + /);
 
function str2binary() {
    idx=0;
    for((i=0; i<${#str}; i++)); do
        dividend=$(printf "%d" "'${str:i:1}");
        for((j=0;j<8;j++)); do
            let idx=8*i+7-j;
            let bin[$idx]=$dividend%2;
            dividend=$dividend/2;
        done;
    done;
    let idx=${#str}*8;
    for((i=0; i<appendEqualCnt*2; i++)); do
        let bin[$idx]=0;
        let idx++;
    done;
}
function calcBase64() {
    for((i=0; i<${#bin[*]}/6; i++)); do
        sum=0;
        for((j=0; j<6; j++)); do
            let idx=i*6+j;
            let n=6-1-j;
            let sum=sum+${bin[$idx]}*2**n;
        done;
        echo -n ${base64Table[$sum]};
    done
}
 
declare -a bin
function base64Encode() {
    read -p "please enter ASCII string:" str;
    let appendZero=${#str}*8%6;
    let bits=${#str}*8;
    appendEqualCnt=0;
    if [[ $appendZero -ne 0 ]]; then
        let appendEqualCnt=(6-$appendZero)/2;
    fi
    str2binary;
    calcBase64;
    if [[ $appendEqualCnt -eq 2 ]]; then
        echo -n "==";
    elif [[ $appendEqualCnt -eq 1 ]]; then
        echo -n "=";
    fi
    echo;
     
}

 

 

 

6.顏色碼表

[root@250-shiyan prog]# cat color
## the test text T
='samples'echo echo " default 40m 41m 42m 43m 44m 45m 46m 47m" ## FG 為前景(foreground)色, BG 為背景(background)色 for FGs in ' m' ' 1m' ' 30m' '1;30m' ' 31m' '1;31m' ' 32m' '1;32m' ' 33m' '1;33m' ' 34m' '1;34m' ' 35m' '1;35m' ' 36m' '1;36m' ' 37m' '1;37m' do FG=$(echo $FGs|tr -d ' ') echo -en " $FGs \033[$FG $T " for BG in 40m 41m 42m 43m 44m 45m 46m 47m; do echo -en " \033[$FG\033[$BG $T \033[0m" done echo done echo

 

5.批量檢測url地址是否可以訪問的兩種寫法,for與while

訓練點
1.錯誤時記錄到文件中並且同時在控制台輸出
2.從文件中循環讀入參數,正確錯誤都記錄到文件中,並且在錯誤時發郵件。

####輸入1: [root@
250-shiyan prog]# cat web #!/bin/bash monitor_dir=/tmp/monitor/ if [ ! -d $monitor_dir ] then mkdir $monitor_dir fi cd $monitor_dir web_stat_log=web.status if [ ! -f $web_stat_log ] then touch $web_stat_log fi server_list_file=server.list if [ ! -f $server_list_file ] then echo "`date '+%Y-%m-%d %H:%M:%S'` ERROR:$server_list_file NOT exists!" |tee -a $web_stat_log exit 1 fi for website in `cat $server_list_file` do url="http://$website" server_status_code=`curl -o /dev/null -s -m 10 --connect-timeout 10 -w %{http_code} "$url"` if [ "$server_status_code" = "200" ] then echo "`date '+%Y-%m-%d %H:%M:%S'` visit $website status code 200 OK" >>$web_stat_log else echo "`date '+%Y-%m-%d %H:%M:%S'` visit $website error!!! server can't connect at 10s or stop response at 10 s, send alerm sms ..." >>$web_stat_log # echo "!app alarm @136xxxxxxxx server:$website can't connect at 10s or stop response at 10s ..." | nc smsserver port & fi done exit 0 ####輸入2: [root@250-shiyan prog]# cat server.list www.1.com www.2.com www.3.com www.4.com www.1.net www.2.net www.3.org www.4.org www.5.cn ####輸出: [root@250-shiyan prog]# cat /tmp/monitor/web.status 2015-02-10 14:50:00 ERROR:server.list NOT exists! 2015-02-10 14:50:10 visit www.1.com error!!! server can't connect at 10s or stop response at 10 s, send alerm sms ... 2015-02-10 14:50:11 visit www.2.com error!!! server can't connect at 10s or stop response at 10 s, send alerm sms ... 2015-02-10 14:50:12 visit www.3.com error!!! server can't connect at 10s or stop response at 10 s, send alerm sms ... 2015-02-10 14:50:12 visit www.4.com error!!! server can't connect at 10s or stop response at 10 s, send alerm sms ... 2015-02-10 14:50:14 visit www.1.net error!!! server can't connect at 10s or stop response at 10 s, send alerm sms ... 2015-02-10 14:50:20 visit www.2.net error!!! server can't connect at 10s or stop response at 10 s, send alerm sms ... 2015-02-10 14:50:21 visit www.3.org status code 200 OK 2015-02-10 14:50:22 visit www.4.org status code 200 OK 2015-02-10 14:50:28 visit www.5.cn status code 200 OK ####另外一種寫法 ####輸入: [root@250-shiyan prog]# cat web1 #!/bin/bash while read URL do echo `date` result=`curl -o /dev/null -s -m 10 --connect-timeout 10 -w %{http_code} $URL` test=`echo $result` if [[ "$test" = "200" ]] then echo "$URL is ok" else echo "$URL is err" #/usr/sbin/sendmail -t << EOF #From:SD-Detect #To:13918888888@139.com,13800000000@139.com #Subject:Detected $URL #------------------------------ #${URL} is err!! #------------------------------ #EOF fi done < /root/sh/prog/server.list [root@250-shiyan prog]# bash web1 Tue Feb 10 15:03:32 CST 2015 www.1.com is err Tue Feb 10 15:03:33 CST 2015 www.2.com is err Tue Feb 10 15:03:34 CST 2015 www.3.com is err Tue Feb 10 15:03:40 CST 2015 www.4.com is err Tue Feb 10 15:03:41 CST 2015 www.1.net is err Tue Feb 10 15:03:41 CST 2015 www.2.net is err Tue Feb 10 15:03:42 CST 2015 www.3.org is ok Tue Feb 10 15:03:43 CST 2015 www.4.org is ok Tue Feb 10 15:03:44 CST 2015 www.5.cn is ok

 

4.

訓練點:
1.從格式化的輸入文件中將字段分別分配給read的三個變量
2.awk的與或判斷
3.如果錯誤日志有內容,則將錯誤內容定義為一個變量,然后傳遞給郵件函數和短信函數以便通知
4.首次執行時,因為沒有Curl_Out.txt與Curl_Out_1.txt文件,會出錯,所以第一次先注釋掉,然后再打開,就會每次都將以前的內容刪掉,重新記錄。

####輸入1:
[root@250-shiyan monitor]# cat aa
#!/bin/bash
smail() {
mail -s "$1" createyuan@sohu.com <<EOF
$1
$2
====
report time: `date +"%F %T"`
shell script: `echo $0`
current user: `whoami`
====
EOF
}

ssms() {
/usr/local/feixin/fetion --mobile=150000000 --pwd=******** --to=13810000000 --msg-gb="fx $1"
}

cd /tmp/monitor
File=server.list
#sed -i /.*/d Curl_Out.txt
#sed -i /.*/d Curl_Out_1.txt

sed -e '/^#/d;/^$/d' ${File} | while read Ip Port URL
do
/usr/bin/curl --connect-timeout 8 --max-time 12 -o /dev/null -s -w %{time_total}:%{size_download}:%{http_code} http://${URL} -x ${Ip}:${Port} >> Curl_Out.txt
echo ":${Ip}:${URL}" >> Curl_Out.txt
done

awk -F":" '{if(($1*1000<8000)&&($2>0)&&($3=="200"||$3=="301"||$3=="302"||$3=="401")) {} else {print $0 >> "Curl_Out_1.txt"}}' Curl_Out.txt

if [ -s Curl_Out_1.txt ]
then
Warning="`awk '{printf("%s\n",$0)}' Curl_Out_1.txt`"
#ssms ${Warning}
smail CURL_Monitor ${Warning}
fi
輸入2:
[root@250-shiyan monitor]# cat server.list
192.168.2.2 80 192.168.2.2
192.168.2.84 8080 192.168.2.84/monitor
192.168.2.222 80 192.168.2.222
192.168.2.225 80 192.168.2.225
[root@250-shiyan monitor]# ls
aa  server.list

輸出1:到文件中
[root@250-shiyan monitor]# bash aa
[root@250-shiyan monitor]# ls
aa  Curl_Out_1.txt  Curl_Out.txt  server.list
[root@250-shiyan monitor]# cat Curl_Out.txt
0.044:1576:200:192.168.2.2:192.168.2.2
0.004:0:302:192.168.2.84:192.168.2.84/monitor
0.050:1563:200:192.168.2.222:192.168.2.222
0.027:1550:200:192.168.2.225:192.168.2.225
[root@250-shiyan monitor]# cat Curl_Out_1.txt
0.004:0:302:192.168.2.84:192.168.2.84/monitor
輸出2:到郵件中,以下是內容
CURL_Monitor
0.004:0:302:192.168.2.84:192.168.2.84/monitor
====
report time: 2015-02-10 15:58:43
shell script: aa
current user: root
====

 

 

 

3.

2.監控磁盤並發郵件

####第一步安裝mail客戶端,寫郵件地址,寫腳本
[root@250-shiyan ~]# vi disk
#!/bin/bash
yum install mail
mailaddr=createyuan1@126.com
smtpserver=smtp.126.com
user=createyuan1
passwd=*******
cat <<EOF >/etc/mail.rc
set from=$mailaddr
set smtp=$smtpserver
set smtp-auth=login
set smtp-auth-user=$user
set smtp-auth-password=$passwd
EOF

space=`df|sed -n '/\/$/p'|gawk '{print $5}'|sed 's/%//'`
if [ $space -ge 10 ]
 then
 echo "disk is $space" >/tmp/test
 mail -v -s "testse" createyuan@sohu.com < /tmp/test
fi

####第二步加入計划任務中執行
[root@250-shiyan ~]# crontab -e
no crontab for root - using an empty one
crontab: installing new crontab
[root@250-shiyan ~]# crontab -l
1 * * * * bash /root/disk

[root@250-shiyan prog]# cat disk1
#!/bin/bash
while sleep 5
  do
    for i in `df -h |sed -n '/\/$/p'|awk '{print $5}'|sed 's/\%//g'`
         do echo $i
         if [ $i -ge 10 ]
         then
         echo "the disk is "
         fi
         done
  done

 

1.樣例

如果是139郵箱還可免費手機短信通知。
注:通過系統直接發送mail容易被攔截,可使用mail連接第三方smtp發送郵件。

    #!/bin/bash  
    for URL in http://www.abc.com http://www.88888.cn  
    do  
    #獲取http響應代碼  
    HTTP_CODE=`curl -o /dev/null -s -w "%{http_code}" "${URL}"`  
    #服務器能正常響應,應該返回200的代碼  
    if [ $HTTP_CODE = 200 ]  
     then   
        echo "$URL is OK" | /bin/mail -s "Http Check" qq@163.com  
    # else  
    #    /usr/local/fetion/fetion --mobile=1356440xxxx --pwd 123456 --to=1885151xxxx --msg-utf8="$URL is ERROR; error code is $HTTP_CODE" 
    fi  
    done

主要是利用 curl -o /dev/null -s -m 10 --connect-timeout 10 -w %{http_code} "$url" 返回狀態碼是否200,如果10s沒有返回200狀態碼,則發警報

-o 參數,是把下載的所有內容都重定向到/dev/null,-s命令,是屏蔽了curl本身的輸出,而-w參數,是根據我們自己的需要,自定義了curl的輸出格式。
使用這條命令,再配合郵件和短信,就可以實現對頁面的可用性監控。將這個程序部署在全國各地的機器上,就可以對cdn網絡進行可用性監控。
curl只返回服務器響應狀態,不返回內容,返回200是正常的,其它的不正常,簡單的命令如下:

[coomix@localhost ~]$ echo `curl -o /dev/null -s -m 10 --connect-timeout 10 -w %{http_code} "http://www.jbxue.com/index.php"`
200
[coomix@localhost ~]$ echo `curl -o /dev/null -s -m 10 --connect-timeout 10 -w %{http_code} "http://www.jbxue.com/index5.php"`
404

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM