linux shell题库,shell习题-30

本文介绍了如何使用Shell脚本在不干扰服务器性能的情况下,快速备份大量数据库,并提供了备份策略和错误处理。同时展示了如何通过Shell进行字符串截取、打印特殊形状(如三角形)以及安全地替代rm命令实现文件删除前的备份操作。内容涵盖了xtrabackup工具的安装和使用,以及文件描述符和管道在并发备份中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目要求

需求背景:

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

参考答案

screen

yum install -y screen

screen

mkfifo 123.fifo

echo "wewrew" > 123.fifo

ctrl+a+d 退出screen

cat 123.fifo

screen -r 测试写入已经完成

exec 100<>test.fifo 这样可以把fd100读和写全部指定到test.fifo中

read -u100 a 将fd100的值赋值给a

echo " wqewqeq" >&100

echo "13123" >&100 连续在fd100中写入两次内容

read -u100 a 第一次读取fd100里面的第一行

echo $a

wqewqeq

read -u100 a 第二次读取fd100里面的第二行

echo $a

13123

#!/bin/bash

#这个脚本用来并发备份数据库

#作者:猿课-阿铭 www.apelearn.com

#日期:2018-12-19

##假设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/nll

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 --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

do

echo >&1000

done

cat /tmp/databases.list | while read line

do

read -u1000

{

bak_data `echo $line`

echo >&1000

} &

done

wait

exec 1000>&-

rm -f $fifofile

题目要求

之前咱们打印过正方形,也打印过乘法口诀,那今天来打印一个三角形(正三角形,元素用*表示)。

参考答案

#!/bin/bash

#这个脚本用来打印三角形

#作者:猿课-阿铭 www.apelearn.com

#日期:2018-12-19

while true

do

read -p "please input the 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

题目要求

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

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

参考答案

#!/bin/bash

#这个脚本用来截取字符串

#作者:猿课-阿铭 www.apelearn.com

#日期:2018-12-19

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 'www' '{print $1}'

echo "6.取出root/123.htm"

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

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

echo "7.取出123"

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

题目要求

请把下面的字符串:

zhangsan

y97JbzPru

lisi

5JhvCls6q

xiaowang

Nnr8qt2Ma

laoma

iqMtvC02y

zhaosi

9fxrb4sJD

改为如下:

zhangsan:y97JbzPru

lisi:5JhvCls6q

xiaowang:Nnr8qt2Ma

laoma:iqMtvC02y

zhaosi:9fxrb4sJD

参考答案

#!/bin/bash

#这个脚本用来格式化文本

#作者:猿课-阿铭 www.apelearn.com

#日期:2018-12-19

n=`wc -l test3.txt|awk '{print $1}'`

n2=$[$n/2]

for i in `seq 1 $n2`

do

i2=$[$i*2]

j=$[$i2-1]

l1=`sed -n "$i2"p test3.txt`

l2=`sed -n "$j"p test3.txt`

echo $l2:$l1

done

题目要求

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

简单

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

复杂

不知道哪个分区有剩余空间,在删除之前先计算要删除的文件或者目录大小,然后对比系统的磁盘空间,如果够则按照上面的规则创建隐藏目录,并备份,如果没有足够空间,要提醒用户没有足够

的空间备份并提示是否放弃备份,如果用户选择y,则直接删除文件或者目录,如果选择n,则提示未删除,然后退出脚本。

参考答案

1. 简单

#!/bin/bash

#这个脚本用来自定义rm

#作者:猿课-阿铭 www.apelearn.com

#日期:2018-12-19

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 && rsync -aR $1 $big_filesystem/.$d/$1 && /bin/rm -rf $1

;;

n|N)

exit 0

;;

*)

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

;;

esac

2.复杂

#!/bin/bash

#这个脚本用来自定义rm

#作者:猿课-阿铭 www.apelearn.com

#日期:2018-12-19

#!/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 $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 "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' or 'n'."

;;

esac

fi

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值