study-32:Shell(二)

來源:互聯網
上載者:User

三,shell指令碼開發基本規範

1,/etc/init.d/functions 中的系統函數  action使用方法:

顯示 xxxx,並且最右端顯示 綠色的 OK字樣:action  "xxxx"    /bin/true  

顯示 xxxx,並且最右端顯示 紅色的 FAILED字樣:action  "xxxx"    /bin/false


 2,使用指令碼實現SSHD服務的啟動、關閉和重新啟動:

#!/bin/bash


[ -f /etc/init.d/functions ] && source /etc/init.d/functions 

cmd=$1

#parameter number
if [ $# -ne 1  -o "$cmd" != "start" -a "$cmd" != "stop" -a "$cmd" != "restart" ]
        then
                echo "USAGE $0 {start|stop|restart}"
                exit 1
fi

#start
if [ "$cmd" == "start" ]
        then 
                /etc/init.d/sshd start &> /dev/null
                sleep 1
                action "starting sshd" /bin/true
                exit 0
fi

#stop
if [ "$cmd" == "stop" ]
        then 
                /etc/init.d/sshd stop &> /dev/null
                sleep 1
                action "stopping sshd" /bin/true
                exit 0
fi

#restartif [ $ ]
if [ "$cmd" == "restart" ]
        then 
                killall sshd
                /etc/init.d/sshd start &> /dev/null 
                sleep 1
                action "restarting sshd" /bin/true
                exit 0
else
        exit 1
fi


3,如何將自訂指令碼添加到chkconfig中,以便實現開機啟動和關機停止的功能

0)將指令碼拷貝到  /etc/init.d/ 下

1)指令碼頂部增加 # chkconfig: 2345   20  60  # 2345 運行層級    20啟動排名順序(不要和現有的衝突)    60關閉排名順序(不要和現有的衝突)

2)指令碼頂部增加 # description: xxxxxx

3)chkconfig添加 指令碼名:chkconfig --add xxxxx

4)chkconfig設定啟動:chkconfig   xxxxx    on

查詢:chkconfig --list xxxxxx  #運行層級2345 顯示on,其他層級顯示off 

備忘:chkconfig的原理: ll /etc/rc.d/rc3.d/ | grep xxxx   #啟動或關閉服務後會產生不同的2個軟串連檔案指向到原始指令碼


5,通過case實現不同選擇顯示不同水果,並用不同的背景色

#!/bin/bash

cat <<EOF
1.apple
2.pear
3.banana
4.cherry
EOF

read -t 5 -p "pls input your choice:" a

expr $a + 0 &> /dev/null
if [ $? -ne 0 ]; then
    echo "pls input a integer"
    exit 1
fi

if [ -z "$a" ]
then
    echo "pls input  choice"
    exit 2
fi
if [ $a -ne 1 -a  $a -ne 2 -a  $a -ne 3 -a  $a -ne 4 ]
then
    echo "pls input right choice"
    exit 3
fi

case "$a" in
  1)
    echo -e "\033[43;37m your select apple\033[0m"
    ;;
  2)
    echo -e "\033[44;37m your select pear\033[0m"
    ;;
  3)
    echo -e "\033[45;37m your select banana\033[0m"
    ;;
  *)
    echo -e "\033[46;37m your select cherry\033[0m"
esac

6,使用指令碼啟動 rsync服務

#!/bin/bash

. /etc/init.d/functions

start_rsyncd(){
        s=`lsof -i:873 | wc -l`
        if [ $s -ge 1 ]
                then
                        echo "rsync has running"
                        exit
        else
                rsync --daemon
                sleep 2
                action "rsync is started" /bin/true
        fi
}

stop_rsyncd(){
        s=`lsof -i:873 | wc -l`
        if [ -z $s ]
                then
                        echo "rsync has stopped"
                        exit
        else
                killall rsync &> /dev/null   # 或者  kill -USR2 "/var/run/rsyncd.pid"    #判斷連接埠或服務不一定正確;工作中,推薦產生flag標識判斷服務是否啟動
                action "rsync is stpped" /bin/true
        fi
}

case "$1" in
        start)
                start_rsyncd
                exit
                ;;
        stop)
                stop_rsyncd
                exit
                ;;
        restart)
                stop_rsyncd
                sleep 2
                start_rsyncd
                exit
                ;;
        *)

echo "USAGE: $0 {start|stop|restart}"
                exit
                ;;
esac


7,兩種方法實現列印5次uptime資訊

#!/bin/bash
maxtime=5
while [ $maxtime -ne 0 ]
do
        uptime
        sleep 2
        maxtime=$((maxtime - 1))
done


#!/bin/bash
maxtime=5
while [ $maxtime -ne 0 ]
do
        uptime
        sleep 2
        maxtime=`echo $maxtime - 1 | bc`
done


8,防止指令碼執行中斷的方法

1) 指令碼.sh   &

2)screen命令

3)nohup  指令碼.sh   &


9,當前指令碼在前台正在執行中,但是又不想停止執行(ctl  + c),可以暫停當前指令碼執行(ctl + z),然後放到後台執行 (bg)

10,jobs:查看後台執行的指令碼或任務

11,fg  +  編號:把當前在後台執行的指令碼或任務 調出到前台

12,其他進程管理命令:

cronttab:設定定時;ps:查看進程;pstree:顯示進程狀態樹;top:顯示進程;nice:改變優先權;nohup:使用者退出系統之後繼續工作;

pgrep:尋找匹配條件的進程;strace:跟蹤一個進程的系統調用(使用情境:某個進程佔用CPU特別高,可以通過 strace  -p  [PID進程號] 跟蹤);ltrace:跟蹤進程調用庫函數的情況;vmstat:報告虛擬記憶體統計資訊


13,儲值10元錢,每發送一次簡訊花費1角5分,類比手機傳送簡訊,到餘額小於1角5分時提示餘額不足請儲值

#!/bin/bash
i=1
sum=1000

while [ $sum -ge 15 ]
do
        sum=$((sum - 15))
        echo "$i - send a message ok, balance: $sum"
        usleep 200000
        ((i++))
done

echo "sum is lower 15fen, pls input"


14,統計apache的 access-xxx.log日誌中每一行的訪問位元組數大小

讀取檔案的每一行有三種辦法:

cat  access-xxx.log  |  while read  line  

do

done

 或者

while read  line

do

done < access-xxx.log

或者

exec  < access-xxx.log

while read  line 

do

done


#實現:

#!/bin/bash
i=0
sum=0
while read line
do
        i=`echo $line|awk '{print $17}'`
        if expr $i + 0 &> /dev/null  #判斷是否為整數
        then
                ((sum=sum + i))
        fi
done<access.example.log
echo "sum:$sum"

15,每隔10秒鐘,使用rsync推送本地mysql-binlog檔案到遠程主機進行備份,要求以守護進程執行

#!/bin/bash
while true
do

        rsync -az /data/mysql-bin.* rsync_backup@192.168.1.9::backup --password-file=/etc/rsync.password &
        sleep 10
done

#添加到 rc.local下,開機啟動

echo "/bin/sh xxxxx.sh  &"  >> /etc/rc.local


16,for 迴圈結構

for in [ x in xxxx ]   #當[ x in xxxx ] 不寫時等於 $@

do

done

for(expr1; expr2; expr3)

do

done

#使用for迴圈設定開機只啟動5個服務

#!/bin/bash
LANG=en
for a in `chkconfig --list|awk '{print $1}'`
do 
    chkconfig $a off
 
done

for a in sshd rsyslog crond network sysstat
do 
    chkconfig $a on 
done

#大量建立10個html檔案

for a in `seq 10`;do touch baby-${a}.html;done;

#批量將baby改為man,並將html修改為大寫

for a in `ls *.html`;do mv $a "`echo $a|sed 's/baby/man/g'|sed 's/html/HTML/g'`";done

或者

for a in `ls *.html`;do mv $a "`echo $a|sed 's/baby\(.*\).html/man\1.HTML/g'`";done


17,獲得隨機字串的幾個方法

#取隨機8位密碼:

echo $RANDOM | md5sum | cut -c 1-8

#使用openssl獲得隨機字串

echo openssl rand -base64  8/10 ...

#使用date獲得隨機數

echo date +%s%N

#使用UUID

cat /proc/sys/kernel/random/uuid

#使用expect配合mkpasswd命令

mkpasswd -l 8


18,寫一個指令碼,實現判斷192.168.1.0/24網路裡,線上使用者的IP有哪些。(使用ping命令實現)

#!/bin/bash
for n in `seq 254`
  do
    ping -c2 192.168.1.$n &> /dev/null
    if [ $? -eq 0 ]
    then
      echo "192.168.1.$n is up" >> up.log
    else
      echo "192.168.1.$n is down" >> down.log
    fi
  done


19,寫一個指令碼,通過web訪問日誌(或網路連接數),通過IPTABLES屏蔽DDOS攻擊的IP

#!/bin/bash

VISITTIMES=5
VISITCOUNT=3

while true
do

  awk '{print $1}' access.log | grep -v '^$' | sort | uniq -c >> /tmp/tmp.log  

  # 或判斷網路連接數: netstat -an|grep EST | awk -F '[ :]+' '{print $6}' | sort | uniq -c >> /tmp/tmp.log

  # netstat詳細參數:http://www.cnblogs.com/tla001/p/6436192.html 

  exec </tmp/tmp.log

  while read line

  do


    ip=`echo $line | awk '{print $2}'`
    count=`echo $line | awk '{print $1}'`

    if [ $count -gt $VISITCOUNT ] && [ `iptables -L -n | grep $ip | wc -l` -lt 1 ]; then
        iptables -I INPUT -s $ip -j DROP  # 重啟iptables失效
        echo "$line is dropped " >> /tmp/droplist.log
    fi

  done

  sleep $VISITTIMES

done


20,列印CHKSTR中單詞不大於6的單詞

#shell中擷取字串長度的7種方法:http://blog.csdn.net/jerry_1126/article/details/51835119

#!/bin/bash


CHKSTR="I am babyes teacher welcome to babyes traning class."

for a in $CHKSTR
do
        if [ ${#a} -lt 7 ]; then
                echo $a
        fi
done


21,監控MYSQL主從同步是否異常,如果異常則傳送簡訊或郵件給管理員

*************************** 1. row ***************************
               Slave_IO_State: Queueing master event to the relay log
                  Master_Host: 172.18.16.22
                  Master_User: repl
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.010362
          Read_Master_Log_Pos: 555176
               Relay_Log_File: mysqld-relay-bin.004136
                Relay_Log_Pos: 502564
        Relay_Master_Log_File: mysql-bin.010327
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: blog
          Replicate_Ignore_DB:
           Replicate_Do_Table: blog.archives
       Replicate_Ignore_Table:
      Replicate_Wild_Do_Table:
  Replicate_Wild_Ignore_Table:
                   Last_Errno: 0
                   Last_Error:
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 555176
              Relay_Log_Space: 364216
              Until_Condition: None
               Until_Log_File:
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File:
           Master_SSL_CA_Path:
              Master_SSL_Cert:
            Master_SSL_Cipher:
               Master_SSL_Key:
        Seconds_Behind_Master: 0 # 和主庫比同步延遲的秒數,這個參數很重要
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error:
               Last_SQL_Errno: 0
               Last_SQL_Error:

階段1:開發一個守護進程指令碼每隔30秒實現檢測一次 (使用檔案類比主從)

#!/bin/bash

while true
do
    array=(`egrep "IO_Running|SQL_Running|Behind_Master|SQL_Errno" master_slave.log | awk '{print $NF}'`)
    if [ "${array[0]}" != "Yes" -o "${array[1]}" != "Yes" -o "${array[2]}" != "0" ]
    then
        warning="MySQL slave is not ok"
        echo $warning
        echo $warning | mail -s $warning 271810784@qq.com
    else
        echo "MySQL slave is ok"
    fi
sleep 30
done

階段2:如果同步出現如下錯誤號碼(1158,1159,1008,1007,1062),請跳過錯誤,進行修複。( 使用主從環境 )

#!/bin/bash

errnoarray=(1158 1159 1008 1007 1062)

mysql_cmd="mysql -uroot -pbabyes -S /data/3307/mysql.sock"
while true
do
    array=($($mysql_cmd -e "show slave status\G" | egrep "IO_Running|SQL_Running|Behind_Master|SQL_Errno" | awk '{print $NF}'))
    if [ "${array[0]}" != "Yes" -o "${array[1]}" != "Yes" -o "${array[2]}" != "0" ]
    then

        for ((i=0;i<${#errnoarray[@]};i++))

do

if [ "${array[3]}" == "${errnoarray[$i]}" ]

then

$mysql_cmd -e "stop slave;set global sql_slave_skip_counter=1;start slave;"

fi

done

        warning="MySQL slave is not ok"
        echo $warning
        echo $warning | mail -s $warning 271810784@qq.com
    else
        echo "MySQL slave is ok"
    fi
sleep 30
done

22,開發LINUX一鍵最佳化指令碼  【見視頻:86 - 7】

01,安裝系統時精簡安裝包(迷你安裝)

02,配置國內高速yum源

03,禁用開機不需要啟動的服務

04,最佳化系統核心參數  /etc/sysctl.conf

05,增加系統檔案描述符、堆棧等配置

06,禁止root遠程登入,修改SSH連接埠為特殊連接埠,禁止DNS,空密碼

07,有外網IP的機器要開啟配置防火牆,僅對外開啟需要提供服務的連接埠,配置或關閉SELINUX

08,清除無用的預設系統賬戶或組(非必須)(添加營運成員的使用者)

09,鎖定敏感檔案,如 /etc/passwd(非必須)

10,設定管理員和互連網時間同步

11,配置sudo對普通使用者權限精細控制

12,配置系統字元集

13,把以上12點寫成一鍵最佳化指令碼

。。。。。。更多最佳化後面還會將的。。。


23,數組(只掌握定義和尋找讀取,增刪改用得少)

1)數組的定義 : array=(1 2 3)

2)擷取數組的長途: echo ${#array[@]}  或者  echo ${#array[*]}

3)列印數組元素 : echo ${array[下標]} # 下標從0開始

4)一次列印出全部數組:echo ${array[@]}  或者  echo ${array[*]}

5)刪除整個數組: unset array

6)刪除指定下標的元素:unset array[下標]

7)數組截取: echo ${array[@]:2:3} #從數組的第2個元素開始,取3個元素,,類似字串截取:aaa="123456"; echo ${aaa:2:3}

8)數組元素替換: echo ${array[@]/5/6} #將下標為5的元素值替換為6,並列印

9)工作中常用舉例: array=($(ls))等


24,開發指令碼監控檔案變化情況,並實現定時檢查 【教程:87--15】

1)每天只能上傳一次檔案

2)上傳完成後,將要監控的檔案,產生MD5指紋庫到指定檔案: file /data/www/website -type f | xargs md5sum > /data/logs/md5sum.db

6a5bc1cc5f80a48b540bc09d082b5855  ./.bash_logout
491259328caba7851914116c2f353123  ./tongji_log.sh
5cbf8812381683efb883d4b5697d6b6f  ./autoservice.sh
55e5d88002dd0cfeb86efa89340a7b9e  ./down.log

3)使用md5sum -c命令檢查指紋庫變化情況:md5sum  -c  /data/logs/md5sum.db

./.bash_logout: OK
./tongji_log.sh: OK
./autoservice.sh: OK
./down.log: OK

4)配合diff,wc -l等命令實現檔案增加、減少、修改等資訊的檢查


相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.