其实这篇文章承接前面的文章,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的,不过中间确实走了不少坑,大家有疑问可以留言相互交流