0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

写一个自动化重启服务脚本

阿铭linux 来源:阿铭linux 作者:阿铭 2022-11-22 10:12 次阅读

我们搞运维的总幻想着,任何线上问题都能靠它自己自愈,它只需要在发生问题时自动解决问题后通知一下我们即可!

这不,今天就有这样一个小需求,对你来说一定非常简单。

【需求】

写一个自动化重启服务脚本,当访问日志频繁出现502状态码时,重启php-fpm服务。

提示:

假定Ngnix访问日志路径为/data/logs/www_access.log

重启php-fpm服务的命令为systemctl restart php-fpm

访问日志片段(里面的200就是状态码)

123.52.13.247 - [30/Jul/202203:15 +0800]bbs.aabcc.cn "/thread-2403963-2-198.html" 200 "http://bbs.aabcc.cn/thread-2403963-1-198.html" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36"
171.8.172.146 - [30/Jul/202203:15 +0800]bbs.aabcc.cn "/thread-2430178-2-7.html" 200 "http://bbs.aabcc.cn:8234/thread-2430178-8-7.html" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36"
171.8.173.103 - [30/Jul/202203:15 +0800]bbs.aabcc.cn "/forum.php?mod=viewthread&action=printable&tid=2407976" 200 "http://bbs.aabcc.cn:8784/forum.php?mod=viewthread&tid=2407976&extra&ordertype=2" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36"
123.52.13.247 - [30/Jul/202203:15 +0800]bbs.aabcc.cn "/thread-2396686-1-245.html" 200 "http://bbs.aabcc.cn/thread-2396686-2-245.html" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36"

脚本可以每分钟执行一次,脚本执行时截取上一分钟的日志,可以计算总日志行数,和出现502的行数,计算比例,这里我给大家定一个比例吧,超过20%就算是有问题啦

【解析】

首先,给出思路:

每分钟执行脚本,将过去一分钟的日志截取出来;

然后分析这一分钟内的日志,计算日志总行数,计算状态码为502的日志行数;

两个数字相除,计算百分比;

拿到百分比数字和20相比较;

高于20执行重启php-fpm服务的命令;

先看第一个需求点,如何拿到过去一分钟的日志?

看日志片段吧,很明显日志里有一个时间字段 "30/Jul/202203:15"

过去一分钟,就是拿当前的分钟减去一分钟,date就可以实现啊 :

date -d "-1 min" +%Y:%H:%M

为了过滤的更加精准,建议在最后面再加个:

所以,从访问日志中截取过去一分钟的日志可以这样做:

last_t=`date -d "-1 min" +%Y:%H:%M"`
tail -n 10000 /data/logs/www_access.log |grep "/${last_t}:"  > /tmp/last.log

解释一下,为什么tail -n 10000呢,因为如果访问日志很大的话,直接去grep会比较耗费时间,所以先将最后面的1w行截取出来,效率会高很多。

当然,这个1w是我预估的,大家也可以根据实际的日志量来评估这个数字,你也可以是1000行。

将过滤后的日志先存放到一个临时文件里,留着备用。

下面就该计算日志总行数,这个很简单,直接 wc -l /tmp/last.log 就行了。

而502状态码的日志行数,还需要使用grep:

grep  -c '" 502 "' /tmp/last.log

大家注意,502左右都带有空格,这是为了更加精准匹配,因为日志里很有可能其它地方包含502关键词。

拿到两个数字后,接下来就该计算百分比了。

百分比要精确到小数点后两位,所以不能直接使用shell中的数学运算,得借助于一个linux下的计算器bc,先看例子吧 :

echo "scale=2; 12*100/101"|bc

4ff15aca-6991-11ed-8abf-dac502259ad0.png

所以对应到本案例中,假设502行数用s502_c变量标记,最后1分钟日志总行数用last_1min_c标记,计算百分比,这样做:

echo "scale=2; ${s502_c}*100/${last_1min_c}"|bc

由于shell中的数学逻辑运算不能使用小数来比较,所以还需要将上面获取到的数字进一步包装,可以将其乘以100,也就是去掉点:

echo "scale=2; ${s502_c}*100/${last_1min_c}"|bc|sed 's/.//'

获取到这个数字后,然后再与2000进行比较。

之后,就是去做判断,若符合条件进行重启操作。

【参考答案】

脚本最终是这样的:

#!/bin/bash
logfile="/data/logs/www_access.log"
last_t=`date -d "-1 min" +%Y:%H:%M`
tail -n 10000 $logfile |grep "/${last_t}:"  > /tmp/last.log
last_1min_c=`wc -l /tmp/last.log|awk '{print $1}'`
s502_c=`grep  -c '" 502 "' /tmp/last.log`
p=`echo "scale=2; ${s502_c}*100/${last_1min_c}"|bc|sed 's/.//'`
if [ $p -gt 2000 ]
then
    echo "`date` 502日志大于20%,需要重启php-fpm服务" >> /tmp/restart_php-fpm.log
    systemctl restart php-fpm
fi




审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    87

    文章

    11219

    浏览量

    208877
  • PHP
    PHP
    +关注

    关注

    0

    文章

    452

    浏览量

    26645
  • Shell
    +关注

    关注

    1

    文章

    363

    浏览量

    23288
  • FPM
    FPM
    +关注

    关注

    0

    文章

    5

    浏览量

    1281
收藏 人收藏

    评论

    相关推荐

    介绍10Python自动化脚本

    在这个自动化时代,我们有很多重复无聊的工作要做。想想这些你不再需要一次又一次地做的无聊的事情,让它自动化,让你的生活更轻松。那么在本文中,我将向您介绍 10 Python
    发表于 10-17 09:27 925次阅读

    10Python脚本来自动化你的日常任务

    今天浩道跟大家分享几个关于python自动化日常工作的实用案例脚本
    发表于 10-25 09:04 708次阅读

    10杀手级的Python自动化脚本

    今天浩道跟大家分享10日常工作中用到的python自动化脚本。让你感受番python简单强大之处!
    发表于 11-28 11:07 669次阅读

    手机自动化测试方法

    脚本生成后点击调试按钮 8.点击左下角的启动键进行脚本回放,不要控制鼠标,此时鼠标会自动点击小萝贝控机大师进而控制手机进行手机APP自动化测试 `
    发表于 07-05 15:07

    手机自动化测试

    之前发布过小萝贝控机大师与按键精灵结合实现手机自动化测试的功能,小萝贝控机大师升级了实现了更多手机自动化测试的功能,如下:l手机功能自动化测试:录制脚本,检查点时点击小萝贝控机大师右边
    发表于 07-08 13:36

    自动化测试脚本开发技巧

    开发自动化测试脚本的技巧和心得软件测试 增量式调试脚本 录制测试脚本,和其他的软件开发成果样,会变得非常大。为了可以成功的回放,需要调试几
    发表于 03-26 16:24 53次下载

    iOS自动化打包脚本

    iOS自动化打包脚本,地址:(https://github.com/hades0918/ipapy) iOS项目自动打包脚本 1.脚本
    发表于 10-12 16:47 0次下载

    来练习Redis部署的脚本

    继Nginx和MySQL的部署脚本之后,相信只要你跟着写了,那么里面的很多关键精髓你已经知晓,今天就来练习Redis部署的脚本吧。
    的头像 发表于 12-01 09:16 751次阅读

    如何创建自动化脚本

    在前面的 bash 初学者系列文章中,我们介绍了关于 bash 的些基础知识,在了解了这些基础知识之后,可以尝试创建自动化脚本,来完成
    的头像 发表于 01-04 16:50 3395次阅读
    如何创建<b class='flag-5'>自动化</b><b class='flag-5'>脚本</b>

    10杀手级的Python自动化脚本分享

    重复性任务总是耗时且无聊,想想你想要张地裁剪 100 张照片或 Fetch API、纠正拼写和语法等工作,所有这些任务都很耗时,为什么不自动化它们呢?在今天的文章中,我将与你分
    的头像 发表于 01-06 15:34 725次阅读

    分享10实用的Python自动化脚本

    重复性任务总是耗时且无聊,想想你想要张地裁剪 100 张照片或 Fetch API、纠正拼写和语法等工作,所有这些任务都很耗时,为什么不自动化它们呢?在今天的文章中,我将与你分
    的头像 发表于 01-21 15:58 1309次阅读

    使用Python脚本实现自动化运维任务

    许多运维工程师会使用 Python 脚本来自动化运维任务。Python 是种流行的编程语言,具有丰富的第三方库和强大的自动化能力,适用于许多不同的领域。
    的头像 发表于 04-08 10:36 1626次阅读

    自动化的测试流程

    自动化的测试流程。
    发表于 05-04 17:48 0次下载

    modelsim自动化仿真实验 利用脚本实现modelsim自动化仿真

    大家好!今天给大家带来的是modelsim自动化仿真程序。我们在代码编写完成时,通常都需要先进行仿真,然后上板实验。但是如果我们每次仿真都要去新建工程,添加.v文件以及testbench文件
    的头像 发表于 07-19 10:10 1600次阅读
    modelsim<b class='flag-5'>自动化</b>仿真实验 利用<b class='flag-5'>脚本</b>实现modelsim<b class='flag-5'>自动化</b>仿真

    keil自动化编译脚本

    这是 keil 的自动化编译脚本,可被其他脚本或程序调用,接收参数并按参数编译 keil 工程,而不必打开 keil 软件,实现程序上的
    的头像 发表于 10-16 17:04 1751次阅读
    keil<b class='flag-5'>自动化</b>编译<b class='flag-5'>脚本</b>