shell训练计划30天之第三十天

例96 并发备份数据库

背景:领导要求小明备份数据库里面的100个库(数据量再几十到几百G),需要以最快的时间完成(5小时以内),并且不能影响服务器性能。

要点:

通过命名管道FIDO来实现

一些小知识点:

一、命名管道

1.再文件系统中FIFO拥有名称,并且是以设备特殊文件的形式存在的;

2.任何进程都可以通过FIFO共享数据

3.除非FIFO两端同时有读与写的进程,否则FIFO的数据流通将会阻塞。

4. 匿名管道是由shell自动创建,存在于内核中,而FIFO是由程序创建的(比如mkfifo命令),存在于文件系统中

4.匿名管道是单向的字节流,而FIFO则是双向的字节流

 

#!/bin/bash

exec &> /tmp/mysql_bak.log

if ! which innobacckupex &>/dev/null

then

echo "安装xtrabackup工具"

rpm -ivh http://www.percona.com/downloads/peercona-release/redhat/0.1-3/percpna-release-0.1-3.noarch.rpm && \

yum install -y percona -xtrabackup-24

if [ $? -ne 0 ]

then

echo "安装xtrabackup工具出错,请检查。"

exit 1

fi

fi

 

bkdir=/data/backup/mysql

bakuser=vvNctM

bakpass=99omeaBHh

 

function bak_data

{

db_name=$1

db_host=$2

db_port=$3

cnf=$4

[ -d $bakdir/$bd_name ] || mkdir -p $bakdir/$db_name

innobackupex --defaults-file=$4 --host=$2 --port=$3 --user=$bakuser --password=$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

echo >&1000

done

 

cat /tmp/databases.list | while read line

do

read -u 1000

{

bak_data `echo $line`

echo >&1000

} &

done

 

wait

exec 1000>&

rm -f $fifofile

 

 

 

例97 打印三角形

要求:打印一个正三角形,元素用*表示

要点:正三角形的元素排列,如果边长为5个*,在shell终端显示该正三角形的话,需要有5行,第一行应该先打印4个空格,然后再打印‘*’,第二行打印三个空格,然后再打印‘*’,一直到第五行打印0个空格

 

#!/bin/bash

while true

do

read -p "please input then lenth: " 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 $j`

do

echo -n " "

done

for p in `seq 1 $i`

do

echo -n "* "

done

echo

done

 

例98 截取字符串

要求:利用你学过的知识点,想办法根据要求截取出字符

字符串var=http://www.aaa.com/root/123.htm

1.取出www.aaa.com/root/123.htm

2.取出123.htm

3.取出http://www.aaa.com/root

4.取出http:

5.取出http://

6.取出root/123.htm

7.取出123

要点

grep/sed/awk

 

echo $var |awk -F '//' '{print $2}'

echo $var |sed 's#http://##'

echo $var |awk -F '/' '{print $5}'

echo $var |sed 's#/123.htm##'

echo $var |awk -F '//' '{print $1}'

echo $var |awk -F 'www' '{print $1}'

echo $var |awk -F 'com/' 'print $2'

echo $var |awk -F '/' '{print $4 "/" $5 }'

echo $var |sed 's/[^0-9]//g'

 

例99 修改文本格式

要求:请把下面的字符串

 

要点:奇数行、偶数行

 

 

例100 自定义rm

要求:linux的rm命令太危险,一不小心就会删除掉系统文件。写一个shell脚本来替换系统的rm命令,要求当删除一个文件或者目录时,都要做一个备份然后再删除。下面两种情况做练习

1.简单

假设有一个大的分区/data/,每次删除文件huozh9e目录之前,都要先在/data/下面创建一个隐藏目录,以日期/时间命名,比如/data/.201703271012/,然后把所有删除的文件同步到该目录下面,可以使用rsync -R把文件路径一起同步

2.复杂

不知道哪个分区有剩余空间,在删除之前先计算要删除的文件或者目录大小,然后对比系统的磁盘空间,如果够则按照上面的规则创建隐藏目录,并备份,如果没有足够空间,要提醒用户没有足够的空间备份并提示是否放弃备份,如果用户选择y,则直接删除文件或者目录,如果选择n则提示未删除,然后退出脚本

#!/bin/bash

filename=$1

big_filesystem=/data/

if [ ! -e $1 ]

then

echo "$1不存在,请使用绝对路径"

exit

fi

d=`date+%Y%m%d%H%M`

read -p "Are U sure delete the file or directory $1 y|n: "c

case $c in

y|Y)

mkdir -p $big_filesystem/ $d && -aR $1 $bin_filesystem/.$d/$1 && /bin/rm -rf $1

;;

n|N)

exit 0

;;

*)

echo "Please input 'y' or 'n' ."

;;

esac

 

复杂的

 

#!/bin/bash

filename=$1

if [ ! -e $1 ]

then

echo "$1 不存在,请使用绝对路径"

exit

fi

d=`date+%Y%m%d%H%M`

f_size=`du -sk $1|awk '{print $1}'`

disk_size=`LANG=en;df -k | grep -vi filesystem|awk '{print $1}'|sort -n |tail -n1`

big_filesystem=`LANG=en;df -k | grep -vi filesystem |sorto -n -k4 | tail -n1 |awk '{print $1}'`

 

if [ $f_size -lt $disk_size ]

then

read -p "Are u user delete then 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:" c

case $c in

y|Y)

echo "It will delete $1 after 5 seconds whitout backup "

for i in `seq 1 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 on n' "

;;

esac

fi

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值