其实这篇文章承接前面的文章,ECS机器环境下可以直接页面配置机器日志定时删除任务,但接入云原生环境后,暂时还没有页面工具来配置定时任务,千台机器,多个日志,总不能一个个删除吧,于是就想到在docker镜像中通过写入crontab脚本来实现定时删除n天前日志
我的机器:Linux Centos7机器
先了解一下
/etc/crontab 文件, 系统级别的定时任务,需要加入用户名
/var/spool/cron 目录, 以用户作为区分,一般会有一个和用户名相同的文件,里面记录了定时任务, 一般使用 crontab -e 创建, 语法中不需要指定用户名
/etc/cron.d/ 和 crontab 文件类似,需要指定用户名
cron执行时,也就是要读取三个地方的配置文件
由于机器比较多,试错成本会比较大,所以可以先在单机执行验证
touch del_log.shvim del_log.sh#!/usr/bin/env bash
#/home/logs为想删除日志所在的路径,前后加的两句输出可以验证是否执行了该文件
echo "Cleaning old logs..."
find /home/logs -mtime +3 -name "*.log.*" -exec rm -rf {} \;
echo "Done for cleaning old logs."crontab -e , 添加一个定时任务, 或者 vim /etc/crontab 添加一条记录
#每天 0 点 10 分运行该命令文件
#为了方便验证,可以改为分钟级别或者几分钟后
10 0 * * * /home/cron/del_log.sh >> /var/log/cron.log 2>&1具体时间设置可以参考下面
# For details see man 4 crontabs
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed(1)重启定时任务systemctl restart crond , 在 Ubuntu 上叫 cron systemctl restart cron (2)重启机器,我是选择重启的机器
重启后,我的日志顺利被删除了,说明脚本OK,可以尝试在镜像中写了
前面单机测试说的就比较多了,下面就简单一些
#!/usr/bin/env bash
#定时删除日志
a=$(date)
echo -e "startTime:\t$a"
#找到/home/logs下符合"*.log.*格式的三天前的日志进行删除
find /home/logs -mtime +3 -name "*.log.*" -exec rm -rf {} \;
echo "Done for cleaning old logs.."#凌晨3点整执行/etc/del_log.sh脚本,并输出到/var/log/cron.log
#这个路径下的/etc/del_log.sh是后面Dockerfile文件复制过去的
00 03 * * * /etc/del_log.sh >> /var/log/cron.log 2>&1注意:这个文件要留出空行,否则会报premature EOF错误
RUN yum -y install sysstat
RUN yum -y install crontabs
COPY del_log.sh /etc/del_log.sh
COPY root /etc/cron.d/root
COPY root /var/spool/cron
RUN chmod +x /etc/del_log.sh && crontab /etc/cron.d/root
#解决crontab执行权限问题
RUN sed -i "s/required/sufficient/g" /etc/pam.d/crond这个启动脚本通常在Dockerfile的CMD中被执行,加到最后一行
CMD crontab /etc/root && service crond start && crontab -l最后,通过tail -f /var/log/cron.log验证定时任务是否执行或者直接看日志是否被删除
这里我也做了一个测试,把删除日志时间改为几分钟后进行了,验证,结果也是OK的
当然这里直接改为凌晨3点执行,第二天验证照样是OK的,不过中间确实走了不少坑,大家有疑问可以留言相互交流