crontab定时任务收集日志

业务背景

系统有一个业务并发量是每秒并发量上万,部了20多台机器,分摊下来每台机器每秒几百并发请求,每小时日志可能都有1G+。由于日志过大,运维只保留了1天的日志,但是审计需要保留60天的日志,所以我们需要抽取一部分日志收集保存,比如每分钟抽取20条日志,保留60天。定的方案有两种,要么用linux定时任务通过shell脚本收集,要么用java工程写代码收集,我觉得直接在linux上操作会简单很多,就尝试写shell脚本收集日志。

编写shell脚本

写简单的shell脚本还是不难的,下面的代码展示:

shell 复制代码
#!/bin/bash
#判断当前时间如果是0点就打包
currentTime=$(date "+%H%M%S")
if [ $currentTime -eq 000000 ]
then
tar -zcvfP /opt/xxx/log/xxx/xxx.`date -d "-1 day" "+%Y%m%d"`.log.tar /opt/xxx/log/collectxxx/collectxxx.log-`date -d "-1 day" "+%Y%m%d"`
rm -rf /opt/xxx/log/collectxxx/collectxxx.log-`date -d "-1 day" "+%Y%m%d"`
fi

#步数,输入参数
step=$1
for (( i = 0; i < 60; i=(i+$step) )); do
if [ ! -d /opt/xxx/log/collectxxx ];
then mkdir /opt/xxx/log/collectxxx
fi
#if [ -f /opt/xxx/log/collectxxx/collectxxx.log-`date "+%Y%m%d"` ];
#then touch /opt/xxx/log/collectxxx/collectxxx.log-`date "+%Y%m%d"`
#fi
tail -$2 /opt/xxx/log/xxx/xxx.log   >> /opt/xxx/log/collectxxx/collectxxx.log-`date "+%Y%m%d"`

sleep $step
#for循环结束
done
exit 0

首先是用#!/bin/bash做开头,然后用了for循环,因为crontab定时任务只支持分钟级,需要通过代码循环实现秒级逻辑。 在linux中 ">"会覆盖原文件内容,">>"是追加到文件末尾,一开始以为">>"要文件存在才能输出到文件,所以添加了if语句判断文件是否存在,后面查了一下发现如果文件不存在会直接创建,但是目录是要存在的。 $1是shell脚本传入第一个参数,可以收集末尾前n行。 注意"[ ]" 前后需要空格,否则会报错...

测试一下shell脚本 直接./xxx.sh启动,报没有权限,通过chmod 777 xxx.sh设置读写权限。执行完测试通过就可以设置linux定时任务了

shell 复制代码
crontab -e
* * * * * /bin/bash /opt/xxx/log/collectxxx.sh 10 3

后面发现突然发现日志不是10秒打一次,而是日志变动就会打十几条,开始不知道是什么问题,感觉奇奇怪怪的,后面通过ps -ef|grep xxx.sh命令,发现原来是之前tail -f定时任务不会关闭,一直在监听着日志变动,十几个定时任务都在跑着...后面我一一kill掉问题解决。

总结

如果是运维的话要熟练掌握shell脚本,比如说定时清理日志,定时收集日志,还有之前在网上找的升级SSH的shell脚本,最近也写了一个部署服务的shell脚本等等。目前用deepseek写个shell脚本还是挺方便的

相关推荐
倔强的石头10619 分钟前
【Linux指南】Makefile入门:从概念到基础语法
linux·运维·服务器
ajassi200024 分钟前
linux C 语言开发 (七) 文件 IO 和标准 IO
linux·运维·服务器
一只游鱼39 分钟前
Zookeeper介绍与部署(Linux)
linux·运维·服务器·zookeeper
lllsure1 小时前
【Docker】存储卷
运维·docker·容器
wheeldown2 小时前
【Linux】 存储分级的秘密
linux·运维·服务器
不做菜鸟的网工2 小时前
Headscale 的部署方法和使用教程
运维
天天进步20152 小时前
掌握React状态管理:Redux Toolkit vs Zustand vs Context API
linux·运维·react.js
大翻哥哥2 小时前
Python 2025:低代码开发与自动化运维的新纪元
运维·python·低代码
半梦半醒*3 小时前
正则表达式
linux·运维·开发语言·正则表达式·centos·运维开发
海域云SeaArea_3 小时前
CentOS7 安装 Jumpserver 3.10.15
运维