Shell腳本中的函數

  • Shell腳本中的函數php

  • 函數就是把一段代碼整理到一個小單元中,並給這個單元起一個名字,當用到這段代碼是直接調用這個單元的名字便可。mysql

  • 格式:function f_name(){sql

  • Commandshell

  • }數組

  • 函數必需要放在最前面bash

  • 示例1服務器

  • #!/bin/bashdom

  • function input() {socket

  • #function能夠省略函數

  • echo $1 $2 $# $0

  • }

  • input 1 a b

  • 示例2(算出數字的和)

  • #!/bin/bash

  • sum() {

  • s=$[$1+$2]

  • echo $s

  • }

  • sum 1 2

  • 示例3

  • #!/bin/bash(顯示ip)

  • ip() {

  • ifconfig |gerp -A1 「$1」 |tail -1 |awk ‘{print $2}’|awk -F’:’ ‘{print $2}’

  • }

  • read -p 「please input the eth name:」 e

  • myip=’ip $e’

  • echo 「$e address is $myip」

  • Shell中的數組

  • 定義數組a=(1 2 3 4 5);echo ${a[@]}

  • echo ${#a[@]}獲取數組的元素個數。

  • echo ${a[2]}讀取第三個元素,數組從0開始。

  • echo ${a[*]}等同於${a[@]}顯示整個數組。

  • 數組賦值:

  • a[1]=100;echo ${a[@]}

  • a[5]=2;echo ${a[@]}若是下標不存在則會制動添加一個元素。

  • 數組的刪除:

  • user a;unset a [1]

  • 數組分片:

  • a=(‘seq 1 5’)

  • echo ${a[@]:0:3}從第一個元素開始,截取3個。

  • echo ${a[@]:1:4}從第二個元素開始,截取4個。

  • echo ${a[@]:0-3:2}從倒數第3個元素開始,截取2個。

  • 數組替換:

  • echo ${a[@]/3/100}

  • a=(${a[@]/3/100})

  • 告警系統需求分析

  • 需求:使用shell定製各類個性化告警工具,但須要統一化管理、規範化管理。

  • 思路:指定一個腳本包,包含主程序、子程序、配置文件、郵件引擎、輸出日誌等。

  • 主程序:做爲整個腳本的入口,是整個系統的命脈。

  • 配置文件:是一個控制中心,用它來開關各個子程序,指定各個相關聯的日誌文件。

  • 子程序:這個纔是真正的監控腳本,用來監控各個指標。

  • 郵件引擎:使用一個Python程序來實現,它能夠定義發郵件的服務器、發郵件人以及發件人密碼。

  • 輸出日誌:整個監控系統要有日誌輸出。

  • Shell項目-告警系統main.sh

  • #!/bin/bash

  • #written by aming

  • #是否發送郵件的開關

  • export send=1

  • #過濾ip地址

  • export addr=’/sbin/ifconfig |grep -A1 ‘eth0’ |awk ‘/inet/ {print $2}’’

  • #eth0根據你要上報的ip更改網卡

  • dir=’pwd’

  • #只須要最後一級目錄名

  • last_dir=’echo $dir|awk -F’/’ ‘{print $NF}’’

  • #下面的判斷目的是,保證執行腳本的時候,咱們在bin目錄裏,否則監控腳本、郵件和日誌頗有可能找不到。

  • if [ $last_dir == 「bin」 ] || [ $last_dir == 「bin/」 ]; then

  • conf_file=」../conf/mon.conf」

  • else

  • echo 「you shoud cd bin dir」

  • exit

  • fi

  • exec 1>>../log/mon.log 2>>../log/err.log

  • echo 「’date + 「%F %T」’ load average」

  • /bin/bash ../shares/load.sh

  • #先檢查配置文件中是否須要監控502

  • if grep -q ‘to_mom_502=1’ $conf_file; then

  • export log=’grep ‘logfile=’ $conf_file |awk -F ‘=’ ‘{print $2}’ |sed ‘s/ //g’’

  • /bin/bash ../shares/502.sh

  • fi

  • Shell項目-告警系統配置文件

  • mon.conf內容

  • ##to config the optinons fi to monitor

  • ##定義mysql的服務器地址、端口一級user、password

  • to mon_cdb=0

  • ##0 or 1, default 0,0 not monitor,1 monitor

  • db_ip=10.20.3.13

  • db_port=3315

  • db_user=username

  • db_pass=passwd

  • ##httpd 若是是1則監控,爲0則不監控

  • to_mon_httpd=0

  • ##php 若是是1則監控,爲0則不監控

  • to_mon_php_socket=0

  • ##http_code_502 須要定義訪問日誌的路徑

  • to_mon_502=1

  • logfile=/data/log/xxx.xxx.com/access.log

  • ##request_count 定義日誌路徑以及域名

  • to_mon_request_count=0

  • req_log=/data/log/www.discuz.net/access.log

  • domainname=www.discuz.net

  • shell項目-告警系統load.sh

  • #!/bin/bash

  • ##writen by aming##

  • load=’uptime |awk -F ‘average:’ ‘{print $2}’ |cut -d’.’ -f1|sed ‘s/ //g’ |cut -d. f1’

  • if [ $load -gt 10 ] && [$send -eq 「1」 ]

  • then

  • echo 「addr ‘date +%T’ load is $load」 >../log/load.tmp

  • /bin/bash ../mail/mail.sh $addr_load $load ../log/load.tmp

  • fi

  • echo 「’date +%T’ load is $load」

  • Shell項目-告警系統502.sh

  • 502.sh內容

  • #!/bin/bash

  • d=’date -d 「-1 min」 +%H:%M’

  • c_502=’grep :$d: $log |grep ‘502’|wc -l’

  • if [ $c_502 -gt 10 ] && [ $send == 1 ]; then

  • echo 「$addr $d 502 count is $c_502」>../log/502.tmp

  • /bin/bash ../mail/mail.sh $addr_502 $c_502 ../log/502.tmp

  • fi

  • echo 「’date +%T’ 502 $c_502」

  • Shell項目-告警系統disk.sh

  • #!/bin/bash

  • ##writen by aming##

  • rm -f ../log/disk.tmp

  • for r in ‘df -h |awk -F ‘[ %]+’ ‘{print $5}’|grep -v Use’

  • do

  • if [ $r -gt 90 ] && [ $send -eq 「1」 ]

  • then

  • echo 「$addr ‘date +%T’ disk useage is $r」 >>../log/disk.tmp

  • fi

  • if [ -f ../log/disk.tmp ]

  • then

  • df -h >> ../log/disk.tmp

  • /bin/bash ../mail/mail.sh $addr_disk $r ../log/disk.tmp

  • echo 「’date +%T’ disk useage is nook」

  • else

  • echo 「’date +%T’ disk useage is ok」

  • fi

  • Shell項目-告警系統mail.sh

  • log=$1

  • t_s=’date +%s’

  • t_s2=’date -d 「2 hours ago」 +%s’

  • if [ 1 -f /tmp/$log ]

  • then

  • echo $t_s2 > /tmp/$log

  • fi

  • t_s2=’tail -1 /tmp/$log |awk ‘{print $1}’’

  • echo $t_s>>/tmp/$log

  • v=$[$t_s-$t_s2]

  • echo $v

  • if [ $v -gt 3600 ]

  • then

  • ./mail.py $1 $2 $3

  • echo 「0」 > /tmp/$log.txt

  • else

  • if [ ! -f /tmp/$log.txt

  • then

  • echo 「0」 > /tmp/$log.txt

  • fi

  • nu=’cat /tmp/$log.txt’

  • nu2=$[$nu+1]

  • echo $nu2>/tmp/$log.txt

  • if [ $nu2 -gt 10 ]

  • then

  • ./mail.py $1 「trouble continue 10 min $2 」 「$3」

  • echo 「0」 > /tmp/$log.txt

  • fi

  • fi

  • 運行告警系統

  • cd /usr/local/sbin/mon/bin

  • bash main.sh

相關文章
相關標籤/搜索