收藏文章 楼主

shell 编程实战100案例

版块:shell   类型:普通   作者:小绿叶技术博客   查看:868   回复:0   获赞:0   时间:2020-09-19 09:54:53

SHELL 脚本编程 

实战 100 例 


目录

1、检测网段主机状态 ..........................................................................................................................6

2、猜数字游戏.......................................................................................................................................6

3、打印乘法口诀...................................................................................................................................8

4、使用 rsync 备份数据........................................................................................................................8

5、切割 Nginx 日志 ...............................................................................................................................9

6、监控服务端口...................................................................................................................................9

7、使用 mtime 删除历史文件或日志文件 ......................................................................................10

8、按照时间截取日志文件................................................................................................................10

9、脚本自动安装 zbbix-agent............................................................................................................11

10、使用脚本快速新建 KVM 虚拟机 ...............................................................................................12

11、编写 nginx 启动脚本 ...................................................................................................................12

12、使用 shell 脚本批量创建用户....................................................................................................15

13、mysql 备份、传输、删除 ...........................................................................................................15

14、自动备份 mysql 库文件 ..............................................................................................................16

15、使用 find 查找指定范围的目录.................................................................................................17

16、一键安装 Nginx ............................................................................................................................17

17、使用脚本登录 ftp 并上传文件...................................................................................................18

18、计算 1-100 所有整数和...............................................................................................................19

19、批量修改文件后缀名..................................................................................................................19

20、使用 shell 备份交换机配置文件................................................................................................20

21、while 死循环的几种写法............................................................................................................20

22、特殊变量及运算符 ......................................................................................................................21

23、文件类型的测试操作说明..........................................................................................................22

24、数据流重导向 ..............................................................................................................................23

25、命令执行的判断依据..................................................................................................................23

26、通配符与特殊符号 ......................................................................................................................24

27、基础正规表示法字符汇总..........................................................................................................26

28、printf 格式化打印 ........................................................................................................................28

29、sed 工具的使用............................................................................................................................29

30、文件比对工具 diff........................................................................................................................29

31、函数...............................................................................................................................................30

32、备份 mongodb 数据 ....................................................................................................................31

33、使用 case、while 和 read 进行查看磁盘信息.........................................................................32

34、压缩并归档文件 ..........................................................................................................................33

35、使用 RANDOM 变量生成随机数并提取最大值.......................................................................34

36、使用 for 循环和 if 语句批量新建/删除用户............................................................................34

37、使用脚本自动对磁盘进行初始化 .............................................................................................36

38、for 循环和 until 循环区别...........................................................................................................38

39、shell 中 echo 用法........................................................................................................................39

40、循环中 break 和 continue 用法..................................................................................................41

41、IO 命令大全..................................................................................................................................42

42、使用函数和循环写 menu 脚本..................................................................................................44

43、sed 脚本命令大全........................................................................................................................45

44、将普通文件转成 xml 格式文件 .................................................................................................47

45、find 命令大全 ...............................................................................................................................48

46、 MySQL 主从监控邮件报警脚本...............................................................................................53

44、MySQL 数据库备份脚本 .............................................................................................................54

45、监控 Nginx 进程的脚本...............................................................................................................55

想系统学习 Linux系统运维的可以关注公众号看看下面这个系列的文

章:

1、检测网段主机状态

使用脚本测试 192.168.1.0/24 整个网段中那些主机是开机状态,那些主机是关机状态,使用

for 循环

使用 while 循环编写

2、猜数字游戏

脚本生成一个 100 以内的随机数字,提示用户才数字,根据用户的输入,提示用户是否猜对,

猜大或猜小继续循环猜,猜对跳出循环。

RANDOM 为系统自动的系统变量,值为 0-32767 的随机数

执行效果

脚本代码:

#!/bin/bash

#数字猜测游戏

num=$[RANDOM%100+1]

while :

do

read -p " 计算机生成了一个 1-100 的随机数,你猜:" cat

if [ $cat -eq $num ];then

echo " 猜对了 "

break

elif [ $cat -le $num ];then

echo " 小了 "

else

echo " 大了"

fi

done

3、打印乘法口诀

使用 shell 的 for 循环写 9x9 乘法口诀,比较简单。

执行效果

4、使用 rsync 备份数据

脚本信息:

#!/bin/bash

#备份日期

DATE=`date +"%F-%H-%M"`

#备份程序域名

Backup_Domain="www.abc.com"

#备份数据目录

Need_Backup=(/usr/local/apache-tomcat-6.0.44 /www/www.abc.com /home/scripts 

/var/spool/cron /etc/rc.d/rc.local /etc/mtab /etc/hosts)

#系统 IP 地址

IP_addr=`/sbin/ifconfig | awk '/inet addr:/&&/Bcast:192.168/ {split($2,a,":"); print a[2]}'`

#数据存放的目录名称

Backup_Dir=${Backup_Domain}_${IP_addr}

#新建备份目录

mkdir /opt/${Backup_Dir}

#删除之前的备份文件,节省磁盘空间

rm -f /opt/${Backup_Dir}/*

cd /opt

#备份数据文件并压缩

for i in ${Need_Backup[*]}

do

i_name=`echo $i|awk -F "[/]" '{print $NF}'`

tar cjvf ./${Backup_Dir}/${Backup_Domain}_${i_name}_${DATE}.ta.bz2 --exclude=*.log.* 

--exclude="*rootlog" --exclude="*catalina.out" --exclude=*.log --exclude

=*.tar.* $i

done

#把备份的目录压缩成一个文件

tar cjvf ${Backup_Dir}_${DATE}_all.tar.bz2 ${Backup_Dir}

#把备份的文件通过 rsync 传到备份机 192.168.1.1 上

rsync -azP ${Backup_Dir}_${DATE}_all.tar.bz2 rsync@192.168.1.1::backup_day 

--password-file=/etc/rsyncd_backup.secrets > /tmp/backup.log 2>&1

#提取数据文件大小和文件传输的大小

SEND_SIZE=`cat /tmp/backup.log | awk '/total size is/ {print $4}'`

FILE_SIZE=`ls -l ${Backup_Dir}_${DATE}_all.tar.bz2 | awk '{print $5}'`

#判断传输是否准确,如果准确将本地文件进行删除

if [[ ${SEND_SIZE} -eq ${FILE_SIZE} ]]

then

rm -f /opt/${Backup_Dir}/*

rm -f /opt/${Backup_Dir}_${DATE}_all.tar.bz2

fi

5、切割 Nginx 日志

脚本信息:

#!/bin/bash

#日志目录

logs_path=/logs/www.ccie.xyz

#切割日志的时间

logs_date=`date -d "yesterday" +%F`

#移动日志

mv ${logs_path}/access.log ${logs_path}/access_${logs_date}.log && gzip 

${logs_path}/access_${logs_date}.log

#重新加载 nginx 程序 pid,如果不加载程序会继续向 access 写日志

kill -USR1 $(cat /usr/local/nginx/logs/nginx.pid

加 crontab 计划任务:

1 0 * * * /bin/bash /nginx_log.sh

6、监控服务端口

脚本信息:

#!/bin/bash

NTOP_PORT=`netstat -lpnt | grep 3000 | awk '{print $4}' | awk -F ":" '{print $NF}'`

if [ $NTOP_PORT -eq "3000" ];then

echo "ntopng already running `date`"

else

/etc/init.d/redis restart

sleep 5

/usr/local/ntopng/bin/ntopng /usr/local/ntopng/etc/ntopng.conf &

fi

7、使用 mtime 删除历史文件或日志文件

在业务系统中会产生很多相关的日志文件,比如应用的访问日志、程序运行日志和系统等相

关日志,日志在一定的时间内非常重要,作为查找问题的关键切入点,但是时间长的日志就

没有价值了,就需要在系统中进行删除。

Linux 系统文件有三个时间戳分别为 Access time、Modify time、Change time,即 atime、mtime、

ctime。

Atime 对文件进行一次读操作,它的访问时间就会改变,比如 cat、more 等操作,但是 stat

不会影响这个时间变化;

Mtime 文件的内容被最后一次修改的时间,比如 vim 操作;

Ctime 当文件的状态被改变的时候,比如权限、用户组等操作,都会改变这个时间;

查找 30 天之前的访问日志并进行删除操作;

脚本信息:

#!/bin/bash

for i in `ls /logs`

do

cd /logs && find $i -type f -mtime +30 -name "*.log" | xargs rm -f

done

关于-mtime 的讲解:

-mtime 0 表示文件修改时间距离当前为 0 天的文件,即距离当前时间不到 1 天(24 小时)

以内的文件。

-mtime 1 表示文件修改时间距离当前为 1 天的文件,即距离当前时间 1 天(24 小时-48 小

时)的文件。

-mtime+1 表示文件修改时间为大于 1 天的文件,即距离当前时间 2 天(48 小时)之外的

文件

-mtime -1 表示文件修改时间为小于 1 天的文件,即距离当前时间 1 天(24 小时)之内的文

8、按照时间截取日志文件

在工作中我们经常通过统计日志来诊断应用,比如 PV 或 UV 等,如何快速的统计固定的时

间内日志呢?今天将使用 awk 和 sed 来统计,两者都可以实现但是有点差别。

以 nginx 的访问日志为例,以下是日志的格式。

1.1.1.1 - - [27/Aug/2018:10:40:01 +0800] "GET 

/xml/important_news_day.json?b1535337602058=1 HTTP/1.1" 200 225 "https://www.abc.

com/health/13001507/20180827/33695845.html?newsbaidu" "Mozilla/5.0 (Windows NT 10.0; 

Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)

Chrome/68.0.3440.106 Safari/537.36" "2.2.2.2"

需求统计 10:40 到 10:45 的日志进行分析。

使用 sed -n 进行日志截取

sed -n '/27\/Aug\/2018:10:40:00/,/27\/Aug\/2018:10:45:59/p' access.log

使用 awk 进行日志截取

awk -F "[ /:]" '$7":"$8>="10:40" && '$7":"$8<="10:45"'access.log

说明:-F 指定分隔符;[ /:] 以空格和/和:作为分隔符;&& 逻辑与的意思。

两者虽然都可以截取某个时间段的日志,但是会发现统计的日志条目不相同,原因是 awk

使用判断时间比较精确,而 sed 在统计结尾时间的时候只会统计一个带有 2018:10:45:59 时

间戳的日志。

9、脚本自动安装 zbbix-agent

脚本信息:

#!/bin/sh

cd /opt

groupadd zabbix -g 201

useradd -g zabbix -u 201 -m zabbix

tar -zxf zabbix-2.2.2.tar.gz

cd zabbix-2.2.2

./configure --prefix=/usr/local/zabbix --sysconfdir=/etc/zabbix --enable-agent

make

make install

mkdir /var/log/zabbix

chown zabbix.zabbix /var/log/zabbix

cp misc/init.d/fedora/core/zabbix_agentd /etc/init.d/

chmod 755 /etc/init.d/zabbix_agentd

cp /etc/zabbix/zabbix_agentd.conf /etc/zabbix/zabbix_agentd.conf.bak

cd /etc/zabbix/ && rm -f zabbix_agentd.conf

cp /opt/zabbix_agentd.conf .

/bin/sed -i s/temp_hostname/`/bin/hostname`/g /etc/zabbix/zabbix_agentd.conf

/bin/sed -i "s#BASEDIR=/usr/local#BASEDIR=/usr/local/zabbix#g" 

/etc/init.d/zabbix_agentd

chkconfig zabbix_agentd on

service zabbix_agentd restart

10、使用脚本快速新建 KVM 虚拟机

脚本信息:

virt-install \

--name=kvm_test \

--ram=8192 \

--vcpus=4 \

--os-type=linux \

--hvm \

--accelerate \

--boot network,cdrom,hd \

--file=/data/kvm_test.qcow2 \

--file-size=80 \

--bridge=br0 \

--graphics vnc,port=5902,listen=0.0.0.0,password=123456 \

--noautoconsole \

--debug

11、编写 nginx 启动脚本

在日常工作中经常源码进行编译安装软件,比如安装 nginx 通常都安装在/usr/local/nginx 该

目录,从而对该软件操作命令为

启动: /usr/local/nginx/sbin/nginx

停止: /usr/local/nginx/sbin/nginx -s stop

热加载: /usr/local/nginx/sbin/nginx -s reload

测试语法:/usr/local/nginx/sbin/nginx -t

然后把对应的启动脚本加在/etc/rc.local 下,开机自动启动

今天通过 shell 脚本编写启动、停止和重启脚本,并添加到系统服务中。

编写脚本截图:

脚本中必须添加这两行,如果不添加会提示“service nginx does not support chkconfig”

# chkconfig: - 85 15

# description: nginx is a World Wide Web server. It is used to serve

然后把脚本放到/etc/init.d/下,执行 chkconfig --add nginx 添加到服务中,然后设置启动级别

chkconfig --level 35 nginx on。

列出 nginx 系统服务 chkconfig --list nginx

以下为脚本信息:

#!/bin/bash

# chkconfig: - 85 15

# description: nginx is a World Wide Web server. It is used to serve

program=/usr/local/nginx/sbin/nginx

pid=/usr/local/nginx/logs/nginx.pid

start(){

if [ -f $pid ];then

echo "nginx running"

else

$program

fi

}

stop(){

if [ ! -f $pid ];then

echo "nginx stop"

else

$program -s stop

echo "nginx stop"

fi

}

reload(){

$program -s reload

echo "nginx reloading complete"

}

status(){

if [ -f $pid ];then

echo "nginx running"

else

echo "nginx stop"

fi

}

case $1 in

start)

start;;

stop)

stop;;

reload)

reload;;

status)

status;;

*)

echo "your input error"

esac

12、使用 shell 脚本批量创建用户

今天分享一个面试题,要求使用 shell 脚本创建 20 个用户,用户名称为 user01-20,用户的

密码为随机生成 6 位字符串即可。

分析:新建多个用户,一定用到循环操作 for 或 while,因为账户名称为 user01-20,那么需

要给生成的数字加一个格式,seq -f ;生成随机字符串可以使用系统变量$RANDOM,默认

随机数字范围 0-32767,不够 6 位怎么办,可以使用 md5 校验然后取校验的字符串即可;。

脚本截图:

脚本还是比较简洁:

#!/bin/bash

for i in $(seq -f "%02g" 1 20);

do

useradd user$i

echo "`echo $RANDOM|md5sum |cut -c 1-6`" | passwd --stdin user$i >> zht.txt

done

13、mysql 备份、传输、删除

脚本信息:

#!/bin/bash

TIME=`date +'%Y-%m-%d'`

#!/bin/bash

TIME=`date +'%Y-%m-%d'`

MYIPADD=1.1.1.100

MYPORT=3324

cd /data/mysql_backup

/usr/local/mysql5.5/bin/mysqldump --socket=/data/mysql3324/mysql.sock --port=3324 -uroot 

-p123456 --default-character-set=latin1 --max_allowed_packet=512M -R -B mysqld

ate > /data/mysql_backup/mysqldata-$MYIPADD-$MYPORT-$TIME.sql

rsync -zruvlo --progress --password-file=/home/scripts/rsync.src 

/data/mysql_backup/mysqldata* oracle@1.1.1.1::mysql_168.189

rsync -zruvlo --progress --password-file=/home/scripts/rsync.src 

/data/mysql_backup/mysqldata* oracle@1.1.1.2::mysql_168.189

find /data/mysql_backup -type f -name "mysqldata*.sql" -mtime 1 | xargs rm -f

14、自动备份 mysql 库文件

使用 shell 写简单的 mysql 库文件备份脚本,由于脚本比较简单就不在详细说内容了,直接

看脚本内容:

脚本信息:

#!/bin/bash

#backup DB APP

bak_dir=/data/backup/`date +%y%m%d`

mysqldb=mydata

mysqluser=root

mysqlpw=123456

mysqlcmd=mysqldump

db_file=mydata`date +%F`.sql

app_file=mydata`date +%F`.tar.gz

if [ ! -d $bak_dir ];then

mkdir -p $bak_dir

echo "`date +%y%m%d` create sucess"

else

echo "This $bak_dir exist"

fi

$mysqlcmd -u$mysqluser -p$mysqlpw $mysqldb >$bak_dir/$db_file

sleep 5

cd /var/www/html && tar -zcvf $bak_dir/$app_file app/

sleep 5

scp -r $bak_dir/$db_file 1.1.1.1:/data/backup/racktables

scp -r $bak_dir/$app_file 1.1.1.1:/data/backup/racktables

sleep 3

echo "files already copy to 1.1.1.1 host"

if [ $? -eq 0 ];then

echo -e "\033[32m------------------------\033[0m"

echo "This $bak_dir sucess `date`"

else

echo "fail `date`"

fi

15、使用 find 查找指定范围的目录

今天分享一个 find 的用法,有个需求需要遍历某个目录或存储上所有指定日期的目录,比

如目录名称为 20180901 即年月日的组合,要找到所有 20000101 年至 20151231 的所有目录

并打印出来。

使用 find 的正则进行查找:

#!/bin/bash

find /www/html -type d -regextype "posix-egrep" -regex 

'.*/20(0[0-9]|1[0-5])(0[1-9]|1[0-2])[0-9][0-9]' >> dir_00_15.list

执行效果,我在/tmp 下创建了多个文件夹如下:

然后执行脚本:

输出结果排除了 19991231、20160101 目录,实验成功。

16、一键安装 Nginx

脚本内容:

#!/bin/bash

yum -y install pcre pcre-devel openssl openssl-devel zlib-devel make gcc

cd /opt

tar -zxvf nginx-1.8.0.tar.gz

cd nginx-1.8.0

./configure --prefix=/usr/local/nginx-1.8.0 --with-http_ssl_module

make

make install

ln -s /usr/local/nginx-1.8.0 /usr/local/nginx

/usr/local/nginx/sbin/nginx

17、使用脚本登录 ftp 并上传文件

脚本内容:

#!/bin/sh

FILE = list.txt

ftp -v -n 192.168.1.1<<EOF #ftp 地址

user ftpuser 123456 #ftp 用户名和密码

binary #二进制文件传输

cd www/html #进入 ftp 目录

lcd ./ #进入本地目录

prompt #交互模式提示

put $FILE #上传文件

bye #终止 ftp 进程

EOF

echo "Successful file transfer"

脚本执行效果:

18、计算 1-100 所有整数和

使用 shell 脚本计算 1-100 所有整数和,使用到 for 循环进行操作。

脚本截图:

脚本信息:

#!/bin/bash

sum=0

for i in `seq 100`

do

sum=$[i+sum]

done

echo "总和为:$sum"

19、批量修改文件后缀名

脚本批量修改文件的扩展名称,比如把 txt 改为 doc。

#!/bin/bash

for i in "ls *.$1"

do

mv $i ${i%.*}.$2

done

执行效果:

sh test.sh txt doc

20、使用 shell 备份交换机配置文件

使用 shell 脚本备份交换机配置文件,脚本包括两部分 shell 脚本和登录信息,这个脚本使用

telnet 登录交换机然后把交换机 startup-config copy 到 tftp 服务器上,这里交换机采用思科交

换机,其实这个方便比较笨,没有 python netmiko 来的直接,以下为脚本信息:

脚本分析:设置变量(tftp 服务器,用户信息和密码,日期格式)

脚本截图:

switch.conf 截图:

21、while 死循环的几种写法

格式一 死循环

while true

do

语句

done

格式二 死循环

while :

do

语句

done

格式三 死循环

while [ 1 ]

do

语句

done

格式四 死循环

while [ 0 ]

do

语句

done

22、特殊变量及运算符

特殊的 shell 变量:

运算符表示方法:

23、文件类型的测试操作说明

文件类型的测试操作:

24、数据流重导向

什么是数据流重导向啊?这得要由指令的执行结果谈起!一般来说,如果你要执行一个指令,

通常他会是这样的:

1. 标准输入 (stdin) :代码为 0 ,使用 < 或 << ;

2. 标准输出 (stdout):代码为 1 ,使用 > 或 >> ;

3. 标准错误输出(stderr):代码为 2 ,使用 2> 或 2>> ;

PS:2>&1 意思为来将 2> 转到 1> 去;

1>&2 区别意思为来将 1> 转到 2> 去;

25、命令执行的判断依据

在某些情况下,很多指令我想要一次输入去执行,而不想要分次执行时,该如何是好?除了

使用脚本外,还可以使用几个特殊的指令进行操作,比如; , &&, ||

:表示在指令与指令中间利用分号(;) 来隔开,这样一来,分号前的指令执行完后就会立刻

接着执行后面的指令了。比如下图:

&&, ||作用如下:

26、通配符与特殊符号

在 bash 的操作环境中还有一个非常有用的功能,那就是通配符! 我们利用 bash 处理数

据就更方便了!底下我们列出一些常用的通配符喔:

以下为例子:

除了通配符之外,bash 环境中的特殊符号有哪些呢?

27、基础正规表示法字符汇总

基础正规表示法字符汇总:

再次强调:『正规表示法的特殊字符』与一般在指令列输入指令的『通配符』并不相同, 例

如,在通配符当中的* 代表的是『0 ~ 无限多个字符』的意思,但是在正规表示法当中, * 

则是『重复 0 到无穷多个的前一个 RE 字符』的意思~使用的意义并不相同,不要搞混了!

28、printf 格式化打印

在很多时候,我们可能需要将自己的数据给他格式化输出的! 举例来说,考试卷分数的输

出,姓名与科目及分数之间,总是可以稍微作个比较漂亮的版面配置吧?那我们就看下 printf

的功能:

printf ‘打印格式’ 实际内容

没有格式的输出内容:

cat ponit

Name Chinese English Math Average DmTsai 80 60 92 77.33 VBird 75 55 80 70.00 Ken 60 90 70 

73.33

范例

29、sed 工具的使用

我们来谈一谈 sed ,sed 本身也是一个管线命令,可以分析 standard input 的啦!而且 sed

还可以将数据进行取代、删除、新增、撷取特定行等等的功能呢!

参数讲解:

使用 sed 过滤 IP 地址信息:

[root@test]#ifconfig ens3 | grep 'inet '| sed 's/inet//g' |sed 's/netmask.*$//g'

192.168.1.1

30、文件比对工具 diff

iff 就是用在比对两个文件之间的差异的,并且是以行为单位来比对的!一般是用在 ASCII 纯

文本档的比对上。由于是以行为比对的单位,因此 diff 通常是用在同一的文件(或软件)的新

旧版本差异上!

范例:

cat 123.old cat 123.new

11111111111111111111 11111111111111111111

22222222222222222222 22222222222222222222

33333333333333333333 33333333333333333333

44444444444444444444

55555555555555555555 55555555555555555555

66666666666666666666 77777777777777777777

diff 123.old 123.new (c 为修改,d 为删除)

4c4

<

---

> 44444444444444444444

6c6

< 66666666666666666666

---

> 77777777777777777777

31、函数

在 Shell 中可以通过下面的两种语法来定义函数,分别如下:

function_name ()

{

statement1

statement2

....

statementn

}

或者

function function_name()

{

statement1

statement2

....

statementn

}

当某个函数定义好了以后,用户就可以通过函数名来调用该函数了。在 Shell 中,函数调用

的基本语法如下,

function_name parm1 parm2

举个栗子

#! /bin/bash

function sayhello()

{

echo "Hello,World"

}

sayhello

# sh hello.sh

Hello,World

32、备份 mongodb 数据

使用 shell 脚本备份 mongodb 数据

#!/bin/bash

#mongodb 数据库备份脚本#数据库名称

DB_NAME="question"

#数据库账户

DB_USER="questionuser"

#数据库密码

DB_PASS="123456"

#mongodb 

bin 目录位置

BIN_DIR="/usr/mongo/bin/"

BCK_DIR="/var/backupdb/"

#时间格式

DATE=`date "+%Y.%m.%d.%H"`

#备份语句

$BIN_DIR/mongodump --host 127.0.0.1 --port 11000 --out $BCK_DIR/$DATE -u $DB_USER -p 

$DB_PASS

#进行压缩

zip -rm $BCK_DIR/$DB_NAME-$DATE.zip $BCK_DIR/$DATE

#上传到 sftp

cd $BCK_DIR

for db_back in $DB_NAME

do 

lftp -u ftpuser,123456 sftp://192.168.1.100 <<EOF 

cd /tmp/wan 

lcd $BCK_DIR 

put $db_back-$DATE.zip 

exit

EOF

done

#删除 5 天前文件

find /var/backupdb/* -mtime +5 -delete

33、使用 case、while 和 read 进行查看磁盘信息

题目:编写一个交互脚本,执行脚本时候键盘输入对应的参数,脚本反馈对应信息,当输入

为“exit”时候脚本退出。

#!/bin/bash

#

cat << EOF

D|d 显示硬盘信息

M|m 显示内存信息

S|s 显示交换分区信息

EOF

read -p "请输入以上对应参数:" CANSHU

while [ $CANSHU != "exit" ]; do

case $CANSHU in

d|D)

df -h

;;

m|M)

free -m | grep Mem

;;

s|S)

free -m | grep Swap

;;

*)

echo "Ukown"

;;

esac

read -p "请再次输入以上对应参数:" CANSHU

done

脚本解释:脚本采用 read 捕捉键盘输入信息,然后使用 case 进行条件选择并执行命令,最

后使用 while 对 case 语句进行循环。

执行效果图:

34、压缩并归档文件

题目:编写一个可以捕捉键盘输入的归档脚本,并支持多种压缩类型;

键盘输入文件名,默认定义三个文件

指定归档文件路径

指定压缩类型

#!/bin/bash

#

read -p "请输入要归档的三个文件: " FILE1 FILE2 FILE3

read -p "请输入归档后的文件名称 " DEST

read -p "请选择压缩类型 gzip|bzip2|xz: " YASUO

case $YASUO in

gzip)

tar -zcvPf ${DEST}.tar.gz $FILE1 $FILE2 $FILE3

;;

bzip2)

tar -jcvPf ${DEST}.tar.bz2 $FILE1 $FILE2 $FILE3

;;

xz)

tar -JcvPf ${DEST}.tar.xz $FILE1 $FILE2 $FILE3

;;

*)

echo "Unkonw"

exit 9

;;

esac

脚本注解:read 捕捉键盘输入字符,指定压缩类型分别为 gzip、bzip2 和 xz,其中压缩参数

大 P 表示文件可以使用绝对路径,默认是相对路径。

执行信息:

35、使用 RANDOM 变量生成随机数并提取最大值

题目:编写一个脚本生成 10 个随机数,并提取最大的一个随机数。

#!/bin/bash

declare -i MAX=0

for i in `seq 1 10`;do

MYRAND=$RANDOM

if [ $i -le 9 ];then

echo -n "$MYRAND,"

else

echo $MYRAND

fi

[ $MYRAND -gt $MAX ] && MAX=$MYRAND

done

echo "Then Max is max $MAX"

脚本注解:

使用 declare 声明变量为整数;

使用 for 循环进行 10 次循环;

$RANDOM 生成随机数

echo -n 不进行换行;

使用条件判断取最大值

脚本执行:

36、使用 for 循环和 if 语句批量新建/删除用户

题目:编写一个脚本添加或删除用户,执行脚本时+add 将创建 10 个用户 user1、user2......,

密码为对应的用户名,执行脚本时+del 将删除 10 个用户 user1、user2......,在执行的时候并

判断其用户是否存在。

#!/bin/bash

if [ $# -lt 1 ];then

echo "Usage: useradd ARG"

exit 2

fi

if [ $1 = 'add' ];then

for i in `seq 1 10`;do

id user$i &> /dev/null

if [ $? -ne 0 ];then

useradd -M user$i

echo "user$i" | passwd --stdin user$i &> /dev/null

echo "user$i create success"

else

echo "user$i exist"

fi

done

elif [ $1 = 'del' ];then

for i in `seq 1 10`;do

if id user$i &> /dev/null;then 

userdel user$i

echo "user$i delete success"

else

echo "NO such user$i"

fi

done

else

echo "Please checck your input ARGS"

exit 1

fi

脚本执行:

新建 user1 在此执行脚本:

删除 user1 再执行脚本:

37、使用脚本自动对磁盘进行初始化

需求:

1、列出系统所有磁盘,并输入对应的操作磁盘,输入“quit”退出脚本,输入错误提示重

新输入;

2、输入正确磁盘后,需要用户再次确认操作,输入“y”进行磁盘初始化,输入“n”退出

脚本,输入错误提示重新输入;

3、对磁盘进行划分两个主分区,分别为 20M 和 50M,在操作之前先删除磁盘所有数据;

脚本:

#!/bin/bash

#

echo "该脚本是对磁盘进行初始化,会导致数据丢失,操作请慎重!!!"

fdisk -l | grep '^Disk /dev/sd[a-z]' | cut -d':' -f1

read -p "Please select disk :" STRING

if [ $STRING == 'quit' ]; then

echo "quit"

exit 2

fi

until fdisk -l | grep '^Disk /dev/sd[a-z]' | cut -d':' -f1 | grep "^Disk $STRING$"; do

echo "Input error "

read -p "Again select disk :" STRING

done

read -p "Please sure your choice's disk :" CHOICE

until [ $CHOICE == 'y' -o $CHOICE == 'n' ]; do

echo "Again input"

read -p "Again your choice's disk :" CHOICE

done

if [ $CHOICE == 'n' ]; then

echo "quit"

exit 3

else

dd if=/dev/zero of=/dev/sdb bs=512 count=1

sync

sleep 3

echo 'n

p

1

+20M

n

p

2

+500M

w' | fdisk $STRING & >/dev/null

fi

运行脚本:

查看分区信息

38、for 循环和 until 循环区别

需求:编写一个脚本每5秒钟来监控 zhtao用户是否登录系统,如果没有登录提示“no login”,

如果登录成功返回登录时间。

使用 while 循环实现:

#!/bin/bash

LOGINUSER=`who | grep zhtao | cut -d' ' -f1`

while [[ $LOGINUSER != 'zhtao' ]]; do

sleep 5

echo "no login"

LOGINUSER=`who | grep zhtao | cut -d' ' -f1`

done

echo "`who | grep zhtao | awk '{print $1}'` Login at `date`"

执行效果:

使用 until 循环实现:

#!/bin/bash

until who | grep zhtao &> /dev/null ; do

echo " no login"

sleep 5

done

echo "`who | grep zhtao | awk '{print $1}'` Login at `date`"

执行效果:

区别说明:

while 循环为满足条件后进入循环体

until 循环为不满足条件进入循环体

39、shell 中 echo 用法

echo 是一个非常简单、直接的 Linux 命令:

$echo argument

echo 将 argument 送出到标准输出( stdout ),通常是在监视器(monitor)上输出。

不妨让我们回到 command line 的概念上来讨论上例的 echo 命令好了:

command line 只有 command_name( echo )及 option( -n ),并没有显示任何 argument 。

要想看看 echo 的 argument ,那还不简单接下来,你可以试试如下的输入:

$echo first linefirst line

$echo -n first linefirst line $

以上两个 echo 命令中,你会发现 argument 的部分显示在你的屏幕, 而换行符则视-n 选

项的有无而别。 很

明显的,第二个 echo 由于换行符被取消了, 接下来的 shell prompt 就接在输出结果的同

一行了

事实上, echo 除了-n 选项之外,常用选项有:

• -e: 启用反斜杠控制字符的转换(参考下表)

关于 echo 命令所支持的反斜杠控制字符如下表:

或许,我们可以通过实例来了解 echo 的选项及控制字符:

例一:

$ echo -e "a\tb\tc\n\d\te\tf"a b c

上例中,用 \t 来分割 abc 还有 def,及用 \n 将 def 换至下一行。

例二:

$echo -e "\141\011\142\011\143\012\144\011\145\011\146"a b cd e f

与例一中结果一样,只是使用 ASCII 八进制编码。

例三:

$echo -e "\\x61\\x09\\x62\\x09\\x63\\x0a\\x64\\x09\\x65\\x09\\x66"

与例二差不多,只是这次换用 ASCII 的十六进制编码。

例四:

$echo -ne "a\tb\tc\nd\te\bf\a"

因为 e 字母后面是退格键(\b),因此输出结果就没有 e 了。 在结束的时听到一声铃响,是

\a 的杰作。 由于同时使

用了-n 选项,因此 shell prompt 紧接在第二行之后。 若你不用-n 的话,那你在\a 后再加个

\c,也是同样的效

果。

事实上,在日后的 shell 操作及 shell script 设计上, echo 命令是最常被使用的命令之一。

比方说,使用 ech

o 来检查变量值:

$ A=B

$ echo $A

B

$ echo $?

0

好了,更多的关于 command line 的格式, 以及 echo 命令的选项, 请您自行多加练习、

运用了

40、循环中 break 和 continue 用法

continue

continue:提前结束本轮循环,而进入下一轮循环;

编写一个脚本计算 1-100 中所有奇数的和等于多少。

#!/bin/bash

#

let SUM=0

let i=0

while [ $i -lt 100 ]; do

let i++

if [ $[$i%2] -eq 0 ]; then

continue

fi

let SUM+=$i

done

echo $SUM

当$i 是偶数时候,continue 后边语句将不再执行。以下为执行结果:

break

break:提前退出循环体

编写一个脚本计算统计 1-100 整数且当和大于 1000 时候,$i 是多少。

#!/bin/bash

#

declare -i SUM=0

for i in {1..100}; do

let SUM+=$i

if [ $SUM -gt 1000 ]; then

break

fi

done

echo $i

echo $SUM

当$SUM 大于 1000 时候,break 将跳出循环,以下为脚本执行信息

41、IO 命令大全

以下 linux IO 相关查看命令,希望对大家有帮助

##iostat 是查看磁盘活动统计情况

##显示所有设备负载情况 r/s: 每秒完成的读 I/O 设备次数。即 rio/s;w/s: 每秒完成的写

I/O 设备次数。即 wio/s 等

iostat 

##每隔 2 秒刷新磁盘 IO 信息,并且每次显示 3 次

iostat 2 3

#显示某个磁盘的 IO 信息

iostat -d sda1

##显示 tty 和 cpu 信息

iostat -t

##以 M 为单位显示磁盘 IO 信息

iostat -m

##查看 TPS 和吞吐量信息 kB_read/s:每秒从设备(drive expressed)读取的数据量;kB_wrtn/s:

每秒向设备(drive expressed)写入的数据量;kB_read:读取的总数据量;kB_wrtn:写入

的总数量数据量;

iostat -d -k 1 1

#查看设备使用率(%util)、响应时间(await)

iostat -d -x -k 1 1

#查看 CPU 状态

iostat -c 1 3

#统计进程(pid)的 stat,进程的 stat 自然包括进程的 IO 状况

pidstat

#只显示 IO

pidstat -d 1 

#-d IO 信息,-r 缺页及内存信息-u CPU 使用率-t 以线程为统计单位 1 1 秒统计一次

pidstat -u -r -d -t 1

#文件级 IO 分析,查看当前文件由哪些进程打开

lsof 

ls /proc/pid/fd

#利用 sar 报告磁盘 I/O 信息 DEV 正在监视的块设备 tps 每秒钟物理设备的 I/O 传输总

量 rd_sec/s 每秒从设备读取的扇区数量 wr_sec/s 每秒向设备写入的扇区数量 avgrq-sz I/O 

请求的平均扇区数

#avgqu-sz I/O 请求的平均队列长度 await I/O 请求的平均等待时间,单位为毫秒 svctm I/O 

请求的平均服务时间,单位为毫秒 %util I/O 请求所占用的时间的百分比,即设备利用率

sar -pd 10 3 

#iotop top 的 io 版

iotop

#查看页面缓存信息 其中的 Cached 指用于 pagecache 的内存大小(diskcache-SwapCache)。

随着写入缓存页,Dirty 的值会增加 一旦开始把缓存页写入硬盘,Writeback 的值会增加直到

写入结束。

cat /proc/meminfo 

#查看有多少个 pdflush 进程 Linux 用 pdflush 进程把数据从缓存页写入硬盘

#pdflush 的行为受 /proc/sys/vm 中的参数的控制 /proc/sys/vm/dirty_writeback_centisecs 

(default 500): 1/100 秒, 多长时间唤醒 pdflush 将缓存页数据写入硬盘。默认 5 秒唤醒 2 个(更

多个)线程。如果 wrteback 的时间长于 dirty_writeback_centisecs 的时间,可能会出问题

cat /proc/sys/vm/nr_pdflush_threads

#查看 I/O 调度器

#调度算法

#noop anticipatory deadline [cfq] 

#deadline : deadline 算法保证对既定的 IO 请求以最小的延迟时间。

#anticipatory: 有个 IO 发生后,如果又有进程请求 IO,则产生一个默认 6ms 猜测时间,猜

测下一个进程请求 IO 是干什么。这对于随机读取会造成较大的延时。对数据库应用很糟糕,

而对于 Web Server 等则会表现不错。

#cfq: 对每个进程维护一个 IO 队列,各个进程发来的 IO 请求会被 cfq 以轮循方式处理,对

每一个 IO 请求都是公平。适合离散读的应用。

#noop: 对所有 IO 请求都用 FIFO 队列形式处理。默认 IO 不会存在性能问题。

cat /sys/block/[disk]/queue/scheduler

#改变 IO 调度器

$ echo deadline > /sys/block/sdX/queue/scheduler

#提高调度器请求队列的

$ echo 4096 > /sys/block/sdX/queue/nr_requests

42、使用函数和循环写 menu 脚本

使用函数、while 和 case 循环编写一个查看磁盘、登录用户和内存相关信息的 Menu 菜单脚

本。

#!/bin/bash

#

function menu {

clear

echo

echo -e "\tSys Admin Menu\n"

echo -e "\t1. Display disk space"

echo -e "\t2. Display logged on users"

echo -e "\t3. Display memory usage"

echo -e "\t0. Exit program\n\n"

echo -en "\tEnter option:"

read -n 1 option

}

function diskspace {

clear 

df -k

}

function whoseon {

clear

who

}

function menusage {

clear

cat /proc/meminfo

}

while [ 1 ]

do

menu

case $option in

0) 

break;;

1) 

diskspace;;

2)

whoseon;;

3)

menusage;;

*)

clear

echo "Sorry, wrong selection";;

esac

echo -en "\nHit any key to continue"

read -n 1 line

done

clear

执行效果:

运行脚本

输入 1

输入 2

输入 0 直接退出

43、sed 脚本命令大全

以下是 sed 常用命令大全

#!/bin/bash

#该脚本来自 github

##查文件从 32994 到 34871 行内容

sed -n '32994,34871p' config_file

##删除文件从 32994 到 34871 行内容

sed '32994,34871 d' config_file

##替换文件中 performance_schema 改为 performance_schema_bak

sed -i "s/performance_schema/performance_schema_bak/g" config_file

##sed 去除注释行

sed -i -c -e '/^#/d' config_file

##sed 去除空行

sed -i -c -e '/^$/d' config_file

##sed 去空行和注释行

sed -i -c -e '/^$/d;/^#/' config_file

##在某字符串下面一行增加一字符串

sed -i '/fastcgi_path_info/a\fastcgi_param ENV_VAR_MY test;' test*.conf

#假设处理的文本为 test.file

#在每行的头添加字符,比如"HEAD",命令如下:

sed 's/^/HEAD&/g' test.file

#在每行的行尾添加字符,比如“TAIL”,命令如下:

sed 's/$/&TAIL/g' test.file

##替换某些后缀文件中的字符

sed -i "s/text_to_replace/replacement/g" `find . -type f -name <filename>`

sed -i "s/10.0.0.75/10.0.0.76/g" `find . -type f -name "*.properties"`

sed -i "s/10.0.0.18/10.0.0.17/g" `find . -type f -name "*.properties"`

sed -i "s/10.0.0.16/10.0.0.17/g" `find . -type f -name "*.php"`

sed -i "s/d12/111222/g" `find . -type f -name "*.properties"`

#sed 删除文件倒数 10 行

#把文件倒序

sed -i '1!G;$!h;$!d' filename 

#删除 10 行

sed -i '1,10d' filename 

#把文件倒序回来

sed -i '1!G;$!h;$!d' filename 

nl file | tail -n 10 | awk 'NR == 1 '{print $1}' 

awk 'BEGIN{CMD="wc -l file";CMD|getline i}NR<=(i-10)' file

sed -n ':a;1,10!{P;N;D;};N;ba' file

44、将普通文件转成 xml 格式文件

需求场景:

公司某个站点删除大量稿件,但是这些稿件已经被百度收录,这样用户访问将会出现 404,

用户体验不太好,所以需要将删除的稿件生成为 xml 格式文件,并且每个文件为 5000 条数

据,然后提交至百度进行收录删除。

普通文件:

https://www.abc.com/html/ys/13003183/20191115/123456.html

https://www.abc.com/html/ys/13003183/20191115/123765.html

https://www.abc.com/html/ys/13003183/20191115/567567.html

https://www.abc.com/html/ys/13003183/20191115/456456.html

https://www.abc.com/html/ys/13003183/20191115/374456.html

https://www.abc.com/html/ys/13003183/20191115/37456645.html

xml 格式文件:

<urlset>

<url> <loc> https://www.abc.com/html/ys/13003183/20191115/37404973.html </loc> </url>

<url> <loc> https://www.abc.com/html/jb/13003184/20191115/37404988.html </loc> </url>

<url> <loc> https://www.abc.com/html/jb/13003184/20191115/37404968.html </loc> </url>

<url> <loc> https://www.abc.com/ylaq/13003182/20191115/37404860.html </loc> </url>

<url> <loc> https://www.abc.com/ylaq/13003182/20191115/37404861.html </loc> </url>

</urlset>

脚本信息:

cat xml.sh

#!/bin/bash

#

sed -i 's/^/\<url\> \<loc\> /g' $1

sed -i 's/$/ \<\/loc\> \<\/url\>/g' $1

name=`echo $1 | awk -F"." '{print $1}'`

echo $name

split -l 5000 $1 ${name}_xml

for filename in `find ./ -name "${name}_xml*"`

do

sed -i '1 i\\<urlset\>' $filename

echo "</urlset>" >> $filename

mv $filename ${filename}.xml

done

执行:

sh xml.sh 文件名称

脚本讲解:

脚本使用 sed 对行首和行尾添加字段;

定义变量去掉文件后缀名称;

使用 split 对文件进行分割;

使用 for 循环对分割后的文件进行添加 xml 首部和尾部字段,然后进行重命名;

45、find 命令大全

以下是 find 命令大全

#find . {-atime/-ctime/-mtime/-amin/-cmin/-mmin} [-/+]num

#atime:访问时间(access time),指的是文件最后被读取的时间,可以使用 touch 命令更

改为当前时间;

#ctime:变更时间(change time),指的是文件本身最后被变更的时间,变更动作可以使 chmod、

chgrp、mv 等等;

#mtime:修改时间(modify time),指的是文件内容最后被修改的时间,修改动作可以使

echo 重定向、vi 等等;

#第一个参数,.,代表当前目录,如果是其他目录,可以输入绝对目录和相对目录位置;

#第二个参数分两部分,前面字母 a、c、m 分别代表访问、变更、修改,后面 time 为日期,

min 为分钟,注意只能以这两个作为单位;

#第三个参数为量,其中不带符号表示符合该数量的,带-表示符合该数量以后的,带+表示

符合该数量以前的。

#找/data 目录下一小时之前文件删除

find /data -mmin +60 -exec rm -f {} \;

#在当前目录下查找以 april 开始的文件

find -name april*

#在当前目录下查找以 april 开始的文件,并把结果输出到 file 中

find -name april* fprint file

#查找以 ap 或 may 开头的文件

find -name ap* -o -name may*

#在/mnt 下查找名称为 tom.txt 且文件系统类型为 vfat 的文件

find /mnt -name tom.txt -ftype vfat

#在/mnt 下查找名称为 tom.txt 且文件系统类型不为 vfat 的文件

find /mnt -name t.txt ! -ftype vfat

#在/tmp 下查找名为 wa 开头且类型为符号链接的文件

find /tmp -name wa* -type l

#在/home 下查最近两天内改动过的文件

find /home -mtime -2

#查 1 天之内被存取过的文件

find /home -atime -1

#在/home 下查 60 分钟前改动过的文件

find /home -mmin +60

#查最近 30 分钟前被存取过的文件

find /home -amin +30

#在/home 下查更新时间比 tmp.txt 近的文件或目录

find /home -newer tmp.txt

#在/home 下查存取时间比 tmp.txt 近的文件或目录

find /home -anewer tmp.txt

#列出文件或目录被改动过之后,在 2 日内被存取过的文件或目录

find /home -used -2

#列出/home 目录内属于用户 cnscn 的文件或目录

find /home -user cnscn

#列出/home 目录内用户的识别码大于 501 的文件或目录

find /home -uid +501

#列出/home 内组为 cnscn 的文件或目录

find /home -group cnscn

#列出/home 内组 id 为 501 的文件或目录

find /home -gid 501

#列出/home 内不属于本地用户的文件或目录

find /home -nouser

#列出/home 内不属于本地组的文件或目录

find /home -nogroup

#列出/home 内的 tmp.txt 查时深度最多为 3 层

find /home -name tmp.txt -maxdepth 4

#从第 2 层开始查

find /home -name tmp.txt -mindepth 3

#查找大小为 0 的文件或空目录

find /home -empty

#查大于 512k 的文件

find /home -size +512k

#查小于 512k 的文件

find /home -size -512k

#查硬连接数大于 2 的文件或目录

find /home -links +2

#查权限为 700 的文件或目录

find /home -perm 0700

#查/tmp 的 tmp.txt 并查看

find /tmp -name tmp.txt -exec cat {} \;

#查/tmp 的 tmp.txt 并删除

find /tmp -name tmp.txt -ok rm {} \;

# 查找在系统中最后 10 分钟访问的文件

find / -amin -10

# 查找在系统中最后 48 小时访问的文件

find / -atime -2

# 查找在系统中为空的文件或者文件夹

find / -empty

# 查找在系统中属于 groupcat 的文件

find / -group cat

# 查找在系统中最后 5 分钟里修改过的文件

find / -mmin -5

#查找在系统中最后 24 小时里修改过的文件

find / -mtime -1

#查找在系统中属于作废用户的文件

find / -nouser

#查找在系统中属于 FRED 这个用户的文件

find / -user fred

#查当前目录下的所有普通文件

find . -type f -exec ls -l {} \;

##在/logs 目录中查找更改时间在 5 日以前的文件并删除它们:

find logs -type f -mtime +5 -exec -ok rm {} \;

##匹配字符串,找出存在字符串文件

find /data -name "*.php" -type f -print0|xargs -0 egrep 

"(phpspy|c99sh|milw0rm|eval\(base64_decode|spider_bc)"|awk -F: '{print $1}'|sort|uniq

find /data -name "*.php" -type f -print0|xargs -0 egrep "aaa"|awk -F: '{print $1}'|sort|uniq

find . -name "*.php" -type f -print0| xargs -0 egrep "aaa|bbb"| egrep "aaa"

##cd /var/cache/yum 找*.rpm 移动到一个文件夹

find . -name "*.rpm" -exec cp {} /root/111 \;

##找到*.log 日志全部删除

find . -name *.log | xargs rm

find . -name *.rpm | xargs rm

find /data/file1 -name .svn -print0 | xargs -0 rm -r -f

find /data/file1 -name .git -print0 | xargs -0 rm -r -f

#删除 5 天之前的日志

find /data/nginx/log/ -ctime +5 -exec rm -f {} \;

find /data/logs -ctime +5 -exec rm -f {} \;

find /data/logs -name "localhost_access_log*.txt" -type f -mtime +5 -print -exec rm -f {} \;

find /data/zookeeper/logs -name "log.*" -type f -mtime +5 -print -exec rm -f {} \;

##删除目录下所有的 .svn 隐藏子目录

find . -name .svn -print0 | xargs -0 rm -r -f

find /data/file1 -name .svn -print0 | xargs -0 rm -r -f

find /data/file1 -name .git -print0 | xargs -0 rm -r -f

find . -name .svn -print0 | xargs -0 rm -r -f

find . -name .git -print0 | xargs -0 rm -r -f

46、 MySQL 主从监控邮件报警脚本

 此脚本应该能适应各种各样不同的内外网环境。

 让脚本也顺便监控下 MySQL 是否正常运行。

 Slave 机器的 IO 和 SQL 状态都必须为 YES,缺一不可,这里用到了多重条件

判断-a。

shell> check_mysql_slave.sh

#!/bin/bash

#check MySQL_Slave Status

MYSQLPORT='netstat -na|grep "LISTEN"|grep "3306"|awk -F[:" "]+ '{print $4}''

MYSQLIP='ifconfig eth0|grep "inet addr" | awk -F[:" "]+ '{print $4}''

STATUS=$(/usr/local/mysql/bin/mysql -u dbuser -dbpwd123 -S /tmp/mysql.sock -e 

"show slave status\G" | grep -i "running")

IO_env='echo $STATUS | grep IO | awk ' {print $2}''

SQL_env='echo $STATUS | grep SQL | awk '{print $2}''

if [ "$MYSQLPORT" == "3306" ]

then

echo "mysql is running"

else

mail -s "warn!server: $MYSQLIP mysql is down" mingongge@gmail.com

fi

if [ "$IO_env" = "Yes" -a "$SQL_env" = "Yes" ]

then

echo "Slave is running!"

else

echo "####### $date #########">> /data/log/check_mysql_slave.log

echo "Slave is not running!" >> /data/log/check_mysql_slave.log

mail -s "warn! $MySQLIP_replicate_error" mingongge@gmail.com 

<</data/log/check_mysql_slave.log

fi

# 建议每 10 分钟运行一次:

shell> crontab -e*/10 * * * * root /bin/sh /root/check_mysql_slave.sh

47、MySQL 数据库备份脚本

一般 Mysql 数据库备份会采用在 MYSQL 从库上执行全量备份+增量备份方式。在从库备份避

免 Mysql 主库备份的时候锁表造成业务影响。

shell> vim db_backup.sh

#!/bin/bash 

# description: MySQL buckup shell script 

# 192.168.10.10 为专门的备份服务器,需要做一下服务器之间免密码登录

#备份的数据库名

DATABASES=( "DB01" "DB02" )

USER="root"

PASSWORD="dbpwd123"

MAIL="mingongge@gmail.com" BACKUP_DIR=/data/backup

LOGFILE=/data/backup/data_backup.log 

DATE=`date +%Y%m%d_%H%M`

cd $BACKUP_DIR

#开始备份之前,将备份信息头写入日记文件 echo "--------------------" >> $LOGFILE 

echo "BACKUP DATE:" $(date +"%y-%m-%d %H:%M:%S") >> $LOGFILE 

echo "-------------------" >> $LOGFILE

for DATABASE in ${DATABASES};do 

/usr/local/mysql/bin/mysqldump -u$USER -p$PASSWORD --events -R --opt 

$DATABASE |gzip >${BACKUP_DIR}\/${DATABASE}_${DATE}.sql.gz 

if [ $? == 0 ];then 

echo "$DATE--$DATABASE is backup succeed" >> $LOGFILE 

else echo "Database Backup Fail!" >> $LOGFILE 

done

#判断数据库备份是否全部成功,全部成功就同步到异地备份 f 服务器

if [ $? == 0 ];then 

/usr/bin/rsync -zrtopg --delete /data/backup/* 

root@192.168.10.10:/data/backup/ >/dev/null 2>&1

else 

echo "Database Backup Fail!" >> $LOGFILE 

#备份失败后向管理者发送邮件提醒 

mail -s "database Daily Backup Fail!" $MAIL 

fi

#删除 30 天以上的备份文件 

find $BACKUP_DIR -type f -mtime +30 -name "*.gz" -exec rm -f {} \;

48、监控 Nginx 进程的脚本

企业负载均衡层如果用到 Nginx+Keepalived 架构,而 Keepalived 无法进行 Nginx 服务的实时

切换,所以这里用了一个监控脚本 check_nginx_pid.sh,每隔 5 秒就监控一次 Nginx 的运行状

态,如果发现有问题就关闭本机的 Keepalived 程序,让 VIP 切换到从 Nginx 负载均衡器上。

shell> vim check_nginx_pid.sh

#!/bin/bash

while :

do

nginxpid='ps -C nginx --no-header | wc -l'

if [$nginxpid -eq 0 ];then 

ulimit -SHn 65535 

/usr/local/nginx/sbin/nginx

sleep 5

nginxpid='ps -C nginx --no-header | wc -l'

if [$nginxpid -eq 0 ];then

/etc/init.d/keepalived stop

fi

fi

sleep 5

done

提供企业建站服务,免费网防系统,提交信息登录 http://yundun.ddoss.cn 邮箱: proposal@ddoss.cn 
回复列表
默认   热门   正序   倒序

回复:shell 编程实战100案例

头像

用户名:

粉丝数:

签名:

资料 关注 好友 消息