实现docker镜像中使用crontab定时删除n天前日志

其实这篇文章承接前面的文章,ECS机器环境下可以直接页面配置机器日志定时删除任务,但接入云原生环境后,暂时还没有页面工具来配置定时任务,千台机器,多个日志,总不能一个个删除吧,于是就想到在docker镜像中通过写入crontab脚本来实现定时删除n天前日志

我的机器:Linux Centos7机器

先了解一下

关于定时任务的配置目录

/etc/crontab 文件, 系统级别的定时任务,需要加入用户名

/var/spool/cron 目录, 以用户作为区分,一般会有一个和用户名相同的文件,里面记录了定时任务, 一般使用 crontab -e 创建, 语法中不需要指定用户名

/etc/cron.d/ 和 crontab 文件类似,需要指定用户名

cron执行时,也就是要读取三个地方的配置文件

由于机器比较多,试错成本会比较大,所以可以先在单机执行验证

一、单机操作验证

1.创建定时任务脚本: del_log.sh

touch del_log.sh

2.授权 chmod +x ./del_log.sh

3.删除 3天的日志文件

vim 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."

4.创建定时任务crontab

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

5.重启定时任务或重启机器

(1)重启定时任务systemctl restart crond , 在 Ubuntu 上叫 cron systemctl restart cron
(2)重启机器,我是选择重启的机器

重启后,我的日志顺利被删除了,说明脚本OK,可以尝试在镜像中写了

⚠️注意

  • 执行脚本使用/bin/sh(防止脚本无执行权限)
  • 要执行的文件路径是从根开始的绝对路径(防止找不到文件)
  • 尽量把要执行的命令放在脚本里,然后把脚本放在定时任务里。对于调用脚本的定时任务,可以把标准输出错误输出重定向到空。
  • 定时任务中带%无法执行,需要加\转义
  • 如果时上有值,分钟上必须有值;日和周不要同时使用,会冲突

二、docker镜像中使用crontab定时删除n天前日志

前面单机测试说的就比较多了,下面就简单一些

1.创建定时任务脚本del_log.sh

#!/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.."

2.创建定时任务文件root

#凌晨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错误

3.追加如下命令到Dockerfile中

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的,不过中间确实走了不少坑,大家有疑问可以留言相互交流

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鲲志说

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值