Shell練習(96-100)-2019.1.29

96.併發備份數據庫

需求:

  • 領導要求小明備份數據庫服務器裏面的100隔庫(數據量在幾十到幾百G),需要以最快的時間完成(5小時內),並且不能影響服務器性能。

核心要點:

  • 通過命令管道FIFO來實現
#!/bin/bash
#這個腳本用來併發備份數據庫
#作者:Chauncey
#日期:2019-01-29

##假設100個庫的庫名、host、port以及配置文件路徑存到了一個文件裏,文件名字爲/tmp/databases.list
##格式:db1 10.10.10.2 3308 /data/mysql/db1/my.cnf
##備份數據庫使用xtrabackup(由於涉及到myisam。命令爲inoobackupex) 

exec &> /tmp/mysql_bak.log

if ! which innobackupex &>/dev/null
then
    echo "安裝xtrabackup工具"
    rpm -ivh http://www.percona.com/downloads/percona-release/redhat/0.1-3/percona-release-0.1-3.noarch.rpm && \
    yum install -y percona-xtrabackup-24
    if [ $? -ne 0 ]
    then
        echo "安裝xtrabackup工具出錯,請檢查。"
        exit 1
    fi
fi

bakdir=/data/backup/mysql
bakuser=vyNctM
bakpass=99omeaBHh

function bak_data {
    db_name=$1
    db_host=$2
    db_port=$3
    cnf=$4
    [ -d $bakdir/$db_name ] || mkdir -p $bakdir/$db_name
    innobackupex --defaults-file=$4  --host=$2  --prot=$3  --user=$bakuser --passwd=$bakpass $bakdir/$1
        if [ $? -ne 0 ]
            then
                echo "備份數據庫$1出現問題。"
        fi
}

fifofile=/tmp/$$
mkfifo $fifofile
exec 1000<>$fifofile


thread=10
for ((i=0;i<$thread;i++))
do
    read -u1000
    {
        bak_data `echo $line`
        echo >&1000
    } &
done

wait
exec 1000>&
rm -f $fifofile

97.併發備份數據庫

需求:

  • 打印一個三角形(正三角形,用*號表示)

核心要點:

  • 正三角形的元素排列,如邊長爲5個*,在shell終端顯示該三角形的話,需要有5行,第一行因該先打印4個空格,然後再打印“*”,第二行先打印3個空格,然後打印‘*’,一直到第5行打印0個空格。
[root@Chauncey ~]# cat 97.sh
#!/bin/bash
#這個腳本用i來打印三角形
#作者:Chauncey
#日期:2019-01-29

while true
do
    read -p "please input the length:" n
    if [ -z $n ]
    then
        echo "要輸入一個數字。"
        continue
    else
        n1=`echo $n|sed 's/[0-9]//g'`
        if [ -n "$n1" ]
        then
            echo "你輸入的不是純數字,重新輸入。"
            continue
        else
            break
        fi
    fi
done

for i in `seq 1 $n`
do
    j=$[$n-$i]
    for m in `seq $`
    do
        echo -n " "
    done

    for p in `seq 1 $i`
    do
        echo -n "* "
    done
    echo 
done

98.截取字符串

需求:

  • 利用你學過的知識點,想辦法根據要求截取出字符串

核心要點:

  • grep/sed/awk
[root@Chauncey ~]# cat 98.sh
#!/bin/bash
#這個腳本用來截取字符串
#作者:Chauncey
#日期:2019-01-29

var="http://www.aaa.com/root/123.htm"

echo "1 取出www.aaa.com/root/123.htm"
echo $var | awk -F"//" '{print $2}'

echo "2 取出123.htm"
echo $var | awk -F"/" '{print $5}'

echo "3 取出http://www.aaa.com/root"
echo $var | sed 's#/123.htm##'

echo "4 取出http:"
echo $var | awk -F '//' '{print $1}'

echo "5 取出http://"
echo $var | awk -F "w" '{print $1}'

echo "6 取出/root/123.htm"
echo $var | awk -F '//' '{print $2}'

echo "7 取出123"
echo $var |sed 's/[^0-9//g]'

99.格式文件

需求:

  • 請把下面的字符串:

核心要點:

  • 奇數、偶數行
[root@Chauncey ~]# cat 99.sh
#!/bin/bash
#這個腳本用來格式化文本
#作者:Chauncey
#日期:2019-01-30

n=`wc -l test3.txt|awk '{print $1}'`
n2=$[$n/2]

for i in `seq 1 $2`
do 
    i2=$[$i*2]
    j=$[$i2-1]
    l1=`sed -n "$j2"p test3.txt`
    l2=`sed -n "$j"p test3.txt`
    echo $l2:$l1
done

99.自定義rm

需求:

  • linux系統的rm命令太危險,一不小心就會刪除掉系統文件。 寫一個shell腳本來替換系統的rm命令,要求當刪除一個文件或者目錄時,都要做一個備份,然後再刪除。下面分兩種情況,做練習:

    1. 簡單

    假設有一個大的分區/data/,每次刪除文件或者目錄之前,都要先在/data/下面創建一個隱藏目錄,以日期/時間命名,比如/data/.201703271012/,然後把所有刪除的文件同步到該目錄下面,可以使用rsync -R 把文件路徑一同同步

    2. 複雜

    不知道哪個分區有剩餘空間,在刪除之前先計算要刪除的文件或者目錄大小,然後對比系統的磁盤空間,如果夠則按照上面的規則創建隱藏目錄,並備份,如果沒有足夠空間,要提醒用戶沒有足夠的空間備份並提示是否放棄備份,如果用戶選擇y,則直接刪除文件或者目錄,如果選擇n,則提示未刪除,然後退出腳本。

[root@Chauncey ~]# cat 100.sh
#!/bin/bash
#這個腳本用來自定義rm
#作者:Chauncey
#日期:2019-01-30

filename=$1
if [ ! -e $1 ]
then
    echo "$1,不存在,請使用絕對路徑"
    exit
fi
d=`date +%Y%m%d%H%M`
f_size=`su -sk $1|awk '{print $1}'`
disk_size=`LANG=en; df -k | grep -vi filesystem|awk '{print $4}' |sort -n | tail -n1`
big_filesystem=`LANG=en; df -k | grep -vi filesystem|sort -n -k4 | tail -n1 |awk '{print $NF}'`
if [$f_size -lt $disk_size ]
then
    read -p "Are U sure delete the file or directory $1? y|n :" c
    case $c in
        y|Y)
            mkdir -p $big_filesystem/.$d && rsync  -aR $1 $big_filesystem/.$d/$1 && /bin/rm -rf $1
            ;;
        n|N)
            exit 0
            ;;
        *)
            echo "Please input 'y' or ''n"
            ;;
    esac
else
    echo "The disk size is not enough to backup the files $1"
    read -p "Do you want to delete $1? y|n: " c
    case $c in
        y|Y)
            echo "Tt will delete $1 after 5 seconds whitout backup."  
            for i in `seq1 5`; do echo -ne ". "; sleep 1; done
            echo
            /bin/rm -rf $1
            ;;
         n|N)
            echo "It will not delete $1."
            exit 0
            ;;
         *)
            echo "Please input 'y' or 'n'"
            ;;
      esac
fi
[root@Chauncey ~]# 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章