背景:
近期项目上线后日志激增,导致存储空间使用超70%。由于该服务器并不仅我自己的项目在使用,考虑到对其他系统的影响并分析了日志构成及重要性,最终决定对日志进行定期清理。
处理方案:
使用crontab服务,根据日志重要程度越高保存时间越长的原则编写脚本清理日志文件。
日志类型 | 类型通配名 | 保存时长 |
---|---|---|
业务类 | BUSINESS_ | 10D |
报错类 | ERROR_ | 180D |
系统消息 | SYSTEM_ | 7D |
该计划氛围三个阶段:
第一阶段:安装crontab
第二阶段:编写脚本,并配置crontab
第三阶段:测试日志处理按计划执行
方案实施:
第一阶段:
1.何为crontab?(wiki)
crontab命令常见于Unix和类Unix的操作系统之中,用于设置周期性被执行的指令。该命令从标准输入设备读取指令,并将其存放于“crontab”文件中,以供之后读取和执行。该词来源于希腊语 chronos(χρνο),原意是时间。通常,crontab储存的指令被守护进程激活, crond常常在后台运行,每一分钟检查是否有预定的作业需要执行。这类作业一般称为cron jobs。
2.为何要选用crontab?
crontab 语言简洁明了,使用方便且对shell 命令支持良好。
3.安装(默认环境是CentOS7.4)
使用yum安装(略过查看版本,及适配选择步骤)
$ yum -y install vixie-cron
$ yum -y install crontabs
简单介绍下:
vixie-cron 是cron的主程序
crontab 软件包是用来安装、卸载、列举用来驱动 cron 守护进程的表格的程序。
相关操作:
crontab 基本操作
$ service crond start //启动服务
$ service crond stop //关闭服务
$ service crond restart //重启服务
$ service crond reload //重新载入配置
$ service crond status //查看crontab服务状态
设置开机自启
$ chkconfig --list crond
crontab任务操作
$ crontab -u //设定某个用户的cron服务,一般root用户在执行这个命令的时候需要此参数
$ crontab -l //列出某个用户cron服务的详细内容
$ crontab -r //删除没个用户的cron服务
$ crontab -e //编辑某个用户的cron服务
任务操作演示
增加一个cron job
$ crontab -e
#进入编辑模式并键入
$ * * * * * /root/testCrontab.sh
#保存并退出
crontab: installing new crontab
您在 /var/spool/mail/root 中有新邮件
展示全部cron jobs
$ crontab -l
* * * * * /root/testCrontab.sh
1 1-12 * * * /root/testCrontab1.sh
*/5 1,12 * * * /root/testCrontab.sh
删除某个用户的全部cron jobs
$ crontab -r
您在 /var/spool/mail/root 中有新邮件
$ crontab -l
no crontab for root
至此crontab job 的基本操作您已经学会了,上手试一试如何配置crontab job吧。
任务配置:
编写cron job 第一要务就是理解语法,我们已上面展示全部cron jobs 为例
# 文件格式說明
# ——分鐘(0 - 59)
# | ——小時(0 - 23)
# | | ——日(1 - 31)
# | | | ——月(1 - 12)
# | | | | ——星期(0 - 7,星期日=0或7)
# | | | | | ——被执行的命令
# | | | | | |
# * * * * * /root/testCrontab.sh
时间操作符号:
- 逗号(',')分开的值,例如:“1,3,4,7,8”
- 连词符('-')指定值的范围,例如:“1-6”,意思等同于“1,2,3,4,5,6”
- 星号('*')代表任何可能的值。例如,在“小时域”里的星号等于是“每一个小时”,等等
- 某些cron程序的扩展版本也支持斜线('/')操作符,代表步长。例如:“*/3”在小时域中等于“0,3,6,9,12,15,18,21”等被3整除的数;
好了开始进行尝试配置自己的cron job 吧。
假定我们需要删除10天前的BUSINESS_2019-01-22.log类日志。
编写删除文件脚本,保证每次仅删除10天前的同类型日志文件。
文件删除脚本:
//vim编辑模式 input shell commands
$ vi /app/log/del_log.sh
#!/bin/bash
#日志文件路径
path=“/app/log/”
#日志保存时长(天)
logDate=“10”
#通配文件名
fileNm="BUSINESS_*.log"
#删除命令
find $path -mtime +$logDate -name "$fileNm" -exec rm -rf {} \;
#查找 路径下 创建时间 (-)近内(+)近外 文件名 xxx 对上述文件执行操作
#标记删除日志
echo “whatever whatever whatever” >> /dir1/dir2/someone.txt
#爱记不记
配置crontab 保证每天在合适的时间段执行该文件删除脚本,为了不影响服务器性能及日常查询,凌晨1~2点是个合适的时段。
界定每日01:10:00 清除10天前的文件。
cron job 配置:
$ crontab -e
#input job config
10 1 * * * /app/log/del_log.sh
剩下的就是等待预定时间后验证目标文件是否按照预想被删除掉了。
问题排查:
建议前期测试的时候执行间隔尽量短方便观测,如果检查脚本及cron job 配置命令正确却不生效的问题,请参考以下几个地方:
1.使用crontab -l 看是否能正常显示出新增任务
2.查看脚本是否有执行权限
3.crontab 配置任务是不需要重新启动的。如果已知办法都不行,可以尝试重启crontab服务
附上unix命令集:
命令快速索引: | |
---|---|
文件系统 | cat cd chmod chown chgrp cksum cmp cp dd du df file fsck fuser ln ls mkdir mount mv pax pwd rm rmdir size split tee touch type umask |
程序 | at bg chroot cron fg kill killall nice pgrep pkill ps pstree time top |
用户环境 | clear env exit finger history id logname mesg passwd su sudo uptime talk |
文本编辑 | awk banner basename comm csplit cut diff dirname ed ex fmt fold head iconv join less more nl paste sed sort spell strings tail tr uniq vi wc |
壳层内建 | |
网络 | dig host ifconfig inetd netcat netstat nslookup ping rdate rlogin route ssh |
查找 | |
文档 | |
软件开发 | |
杂项 | |