博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
shell脚本案例(二)
阅读量:4125 次
发布时间:2019-05-25

本文共 7623 字,大约阅读时间需要 25 分钟。

接上篇

16、服务器上跑的是LNMP环境,近期总是有502现象。502为网站访问的状态码,200正常,502错误是nginx最为普遍的错误状态码。由于502只是暂时的,并且只要一重启php-fpm服务则502消失,但不重启的话,则会一直持续很长时间。所以有必要写一个监控脚本,监控访问日志的状态码,一旦发生502,则自动重启一下php-fpm。
我们设定:
1)access_log /data/log/access.log
2)脚本死循环,每10s检测一次(假设每10s钟的日志条数为300左右)
3)重启php-fpm的方法是 /etc/init.d/php-fpm restart

  • 用curl检测状态码是否是502或者通过分析访问日志判断状态码的比率
  • 重启php-fpm服务的命令
#!/bin/bashlog=/data/log/access.logwhile :do502_n=`tail -n 300 $log |grep -c ' 502 '`if [ -z "$502_n" ]then    exitfiif [ $502_n -gt 100 ]then    /etc/init.d/php-fpm restart >/dev/null 2>/tmp/php-fpm.err    fpm_p_n=`pgrep -l php-fpm|wc -l`    if [ $fpm_p_n -eq 0 ]    then        python mail.py xxx@xx.com "php-fpm重启失败" "`head -1 /tmp/php-fpm.err`"        exit    fifisleep 10done

17、有两台Linux服务器A和B,假如A可以直接ssh到B,不用输入密码。A和B都有一个目录叫做/data/web/ 这下面有很多文件,当然我们不知道具体有几层子目录,假若之前A和B上该目录下的文件都是一模一样的。但现在不确定是否一致了。固需要我们写一个脚本实现这样的功能,检测A机器和B机器/data/web/目录下文件的异同,我们以A机器上的文件作为标准。比如,假若B机器少了一个a.txt文件,那我们应该能够检测出来,或者B机器上的b.txt文件有过改动,我们也应该能够检测出来(B机器上多了文件不用考虑)。

#!/bin/bashdir=/data/web[ -f /tmp/md5.list ] && rm -f /tmp/md5.listfind $dir/ -type f > /tmp/file.listwhile read line do    md5sum $line  >> /tmp/md5.listdone < /tmp/file.listscp /tmp/md5.list B:/tmp/[ -f /tmp/check_md5.sh ] && rm -f /tmp/check_md5.shcat >/tmp/check_md5.sh << EOF#!/bin/bashdir=/data/webn=\`wc -l /tmp/md5.list|awk '{print \$1}'\`for i in \`seq 1 \$n\`do    file_name=\`sed -n "\$i"p /tmp/md5.list |awk '{print \$1}'\`    md5=\`sed -n "\$i"p /tmp/md5.list|awk '{print \$2}'\`    if [ -f \$file_name ]    then	md5_b=\`md5sum \$file_name\`	if [\$md5_b != \$md5 ]	then	    echo "\$file_name changed."	fi    else	echo "\$file_name lose."    fidoneEOFscp /tmp/check_md5.sh B:/tmp/ssh B "/bin/bash /tmp/check_md5.sh"

18、设计一个shell脚本来备份数据库,首先在本地服务器上保存一份数据,然后再远程拷贝一份,本地保存一周的数据,远程保存一个月。假定,我们知道mysql root账号的密码,要备份的库为discuz,本地备份目录为/bak/mysql, 远程服务器ip为192.168.123.30,

远程提供了一个rsync服务,备份的地址是 192.168.123.30::backup . 写完脚本后,需要加入到cron中,每天凌晨3点执行。

  • 备份数据库的命令
  • 同步到远程去的命令
  • 本地一周,可以用date +%w做为后缀,远程一个月可以用date +%d做为后缀
#!/bin/bashd1=`date +%w`d2=`date +%d`local_bakdir=/bak/mysqlremote_bakdir=192.168.123.30::backupexec 1> /tmp/mysqlbak.log  2>/tmp/mysqlbak.errecho "mysql bakcup begin at `date`"mysqldump -uroot -pxxxx discz > $local_bakdir/discuz.sql.$d1rsync -az $local_bakdir/discuz.sql.$d1 $remote_bakdir/discuz.sql.$d2echo "mysql backup end at `date`"

19、计算文档a.txt中每一行中出现的数字个数并且要计算一下整个文档中一共出现了几个数字。例如a.txt内容如下:

12aa*lkjskdj
alskdflkskdjflkjj
我们脚本名字为 ncount.sh, 运行它时:
bash ncount.sh a.txt
输出结果应该为:
2
0
sum:2

#!/bin/bashsum=0while read linedo    line_n=`echo $line|sed 's/[^0-9]//g'|wc -L`    echo $line_n    sum=$[$sum+$line_n]done < $1echo "sum:$sum"

20、写一个脚本,判断本机的80端口(假如服务为httpd)是否开启着,如果开启着什么都不做,如果发现端口不存在,那么重启一下httpd服务,

并发邮件通知你自己。脚本写好后,可以每一分钟执行一次,也可以写一个死循环的脚本,30s检测一次。

  • 检测80端口使用nmap -p 80 127.0.0.1或者netstat -lntp|grep -w 80
  • 重启httpd服务的命令要知道
  • 发邮件脚本依然使用mail.py
#!/bin/bashm=123@123.comwhile :do    n=`netstat -lntp |grep ':80 '|wc -l`    if [ $n -eq 0 ]    then        /usr/local/apache2/bin/apachectl -k restart 2>/tmp/apache.err        python mail.py $m "80端口关闭" "已经重启httpd服务"        pn=`pgrep -l httpd|wc -l`	if [ $pn -eq 0 ]	then	    python mail.py $m "httpd重启失败" "`head -1 /tmp/apache.err`"	fi    fi        sleep 30done

21、假如需要每小时都去执行一个脚本。在脚本中实现这样的功能,当时间是0点和12点时,需要将目录/data/log/下的文件全部清空,注意只能清空文件内容而不能删除文件。而其他时间只需要统计一下每个文件的大小,一个文件一行,输出到一个按日期和时间为名字的日志里。需要考虑/data/log/目录下的二级、三级、… 等子目录里面的文件。

#!/bin/bashdir=/tmp/log_statt=`date +%d%H`t1=`date +%H`logdir=/data/log[ -d $dir ] || mkdir $dir[ -f $dir/$t.log ] && rm -f $dir/$t.logif [ $t == "00" -o $t == "12" ]then    for f in `find $logdir/ -type f`    do	> $f    doneelse    for f in `find $logdir/ -type f`    do	du -sh $f >> $dir/$t.log    donefi

22、找到/123目录下所有后缀名为.txt的文件

  1. 批量修改.txt为.txt.bak
  2. 把所有.bak文件打包压缩为123.tar.gz
  3. 批量还原文件的名字,即把增加的.bak再删除
  • find用来查找所有.txt文件
  • tar打包一堆文件
  • 还原文件名用for循环
#!/bin/bashfind /123/ -type f -name "*.txt" > /tmp/txt.list for f in `cat /tmp/txt.list`do    mv $f  $f.bakdone#find /123/ -type f -name *.txt |xargs -i mv {
} {
}.bak #find /123/ -type f -name *.txt -exec mv {
} {
}.bak \;for f in `cat /tmp/txt.list`do echo $f.bakdone > /tmp/txt.bak.list tar -czvf 123.tar.gz `cat /tmp/txt.bak.list |xargs `for f in `cat /tmp/txt.list`do mv $f.bak $fdone

23、写一个shell脚本来看看你使用最多的命令是哪些,列出你最常用的命令top10。

cat ~/.bash_history |sort |uniq -c |sort -nr |head

24、设计一个脚本,监控远程的一台机器(假设ip为180.163.26.39)的存活状态,当发现宕机时发一封邮件给你自己。

ping -c10 180.163.26.39 通过ping来判定对方是否在线
发邮件脚本 https://coding.net/u/aminglinux/p/aminglinux-book/git/blob/master/D22Z/mail.py

#!/bin/bashn=`ping -c5 180.163.26.39|grep 'packet' |awk -F '%' '{print $1}' |awk '{print $NF}'`if [ -z "$n" ]then    echo "脚本有问题。"    python mail.py  $m "检测机器存活脚本$0有问题" "获取变量的值为空"    exitelse    n1=`echo $n|sed 's/[0-9]//g'`    if [ -n "$n" ]    then        echo "脚本有问题。"        python mail.py  $m "检测机器存活脚本$0有问题" "获取变量的值不是纯数字"        exit     fifiif m=123@qq.comwhile :do    if [ $n -ge 50 ]    then    	python mail.py $m "机器宕机" "丢包率是$n%"    fi    sleep 30done

25、有一台服务器作为web应用,有一个目录(/data/web/attachment)不定时地会被用户上传新的文件,但是不知道什么时候会上传。所以,需要我们每5分钟做一次检测是否有新文件生成。请写一个shell脚本去完成检测。检测完成后若是有新文件,还需要将新文件的列表输出到一个按年、月、日、时、分为名字的日志里。

#!/bin/bashbasedir=/data/web/attachmentt=`date +%Y%m%d%H%M`find $basedir/ -type f -mmin -5 > /tmp/file.listn=`wc -l /tmp/file.list|awk '{print $1}'`if [ $n -lt 0 ]then   mv /tmp/file.list /tmp/$t.listfi

26、写一个脚本计算一下linux系统所有进程占用内存大小的和。

  • ps命令用法
  • for循环
  • 加法运算
#!/bin/bashsum=0for n in `ps aux |grep -v 'TIME COMMAND'|awk '{print $6}'`do    sum=$[$sum+$n]doneecho $sum

27、写一个shell脚本,检测所有磁盘分区使用率和inode使用率并记录到以当天日期为命名的日志文件里,当发现某个分区容量或者inode使用量大于85%时,发邮件通知你自己。

#!/bin/bashdir=/tmp/diskd=`date +%F`mail=123@123.com[ -d $dir ] || mkdir $dirdf >> $dir/$d.logdf -i >> $dir/$d.logdf|sed '1d' |awk -F ' +|%' '$5>=85 {print $7}' > $dir/df.tmpdf -i|sed '1d' |awk -F ' +|%' '$5>=85 {print $7}' > $dir/df_i.tmpn1=`wc -l $dir/df.tmp|awk '{print $1}'`n2=`wc -l $dir/df_i.tmp|awk '{print $1}'`tag=0if [ $n1 -gt 0 ]then    if [ $n2 -gt 0 ]    then	tag=11    else	tag=10    fielse    if [ $n2 -gt 0 ]    then	tag=01    else	tag=00    fificase $tag in    11)	python mail.py $mail "磁盘空间和inode使用率高于85%" "`cat $dir/df.tmp $dir/df_i.tmp|xargs`"        ;;    10)	python mail.py $mail "磁盘空间使用率高于85%" "`cat $dir/df.tmp|xargs`"	;;    01)	python mail.py $mail "磁盘inode使用率高于85%" "`cat $dir/df_i.tmp|xargs`"	;;    *)	;;esac

28、有日志1.log,部分内容如下

112.111.12.248 – [25/Sep/2013:16:08:31 +0800]formula-x.haotui.com “/seccode.php?update=0.5593110133088248″ 200″http://formula-x.haotui.com/registerbbs.php” “Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1;)”61.147.76.51 – [25/Sep/2013:16:08:31 +0800]xyzdiy.5d6d.com “/attachment.php?aid=4554&k=9ce51e2c376bc861603c7689d97c04a1&t=1334564048&fid=9&sid=zgohwYoLZq2qPW233ZIRsJiUeu22XqE8f49jY9mouRSoE71″ 301″http://xyzdiy.5d6d.com/thread-1435-1-23.html” “Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)”

统计出每个IP访问量有多少

awk '{print $1}' 1.log|sort |uniq -c |sort -n -r

29、写个shell,看看你的Linux系统中是否有自定义用户(普通用户),若是有,一共有几个

#!/bin/bashv=`awk -F 'release ' '{print $2}' /etc/redhat-release |cut -d '.' -f1`user(){
if [ $1 -eq 0 ] then echo "系统没有自定义的用户" else echo "系统存在自定义用户,有$1个" fi}case $v in 5|6) n=`awk -F ':' '$3>=500' /etc/passwd|wc -l` user $n ;; 7) n=`awk -F ':' '$3>=1000' /etc/passwd|wc -l` user $n ;; *) echo "脚本出错." ;;esac

30、请按照这样的日期格式(xxxx-xx-xx)每日生成一个文件,

例如生成的文件名为2017-12-20.log,
并且把磁盘的使用情况写到到这个文件中,
不用考虑cron,仅仅写脚本即可

#! /bin/bashd=`date +%F`dir=/data/logs/disklogif [ ! -d $dir ]then        mkdir -p $dirfidf -h > $dir/$d.logfind $dir/ -mtime +365 -exec rm -rf {
} \;

转载地址:http://xrlpi.baihongyu.com/

你可能感兴趣的文章
Vue + Django 2.0.6 学习笔记 6.5
查看>>
C++ Primer Plus 学习笔记 第十四章 valarray类 私有继承
查看>>
关于无法使用HttpRequester使token自动生成key和postman的使用
查看>>
C++ Primer Plus 学习笔记 第十四章 保护继承 多重继承
查看>>
C++ Primer Plus学习笔记 第十四章 类模板
查看>>
C++ Primer Plus 学习笔记 第十四章 指针类型模板 模板多功能型 模板的具体化
查看>>
C++ Primer Plus 学习笔记 成员模板 模板用作参数 模板友元 模板别名
查看>>
Vue + Django 2.0.6 学习笔记 7.1 drf的token登录
查看>>
Vue + Django2.0.6学习笔记 7.2 drf的token登录和原理
查看>>
vue + django2.0.6 学习笔记7.3-7.4 viewset配置认证类
查看>>
Vue + Django 2.0.6 学习笔记 7.5 json web token方式完成认证
查看>>
Vue + Django2.0.6 学习笔记 7.6 vue和jwt接口调试
查看>>
谷歌浏览器插件安装Vue插件 ,Vue Devtools
查看>>
Vue + Django 2.0.6 学习笔记 7.7云片网发送短信
查看>>
C++ Primer Plus 学习笔记 第十五章 友元类 友元成员函数 其他友元关系 共同的友元 嵌套类
查看>>
C++ Primer Plus 学习笔记 第十五章 异常 abort() 返回错误提示,try-throw-catch exception和其派生类 RTTI 类型转换运算符
查看>>
Vue + Django 2.0.6 学习笔记 7.8-9 drf实现发送短信验证码接口
查看>>
C++ Primer Plus 学习笔记 第十六章 string类
查看>>
Vue + Django 2.0.6 学习笔记 7.10-11user serializer和validatior验证
查看>>
C++ Primer Plus 学习笔记 第十六章 string类, 智能指针模板类
查看>>