定时执行系统及容器日志清理
1. find
1.1. find简介
find 是 Linux 中强大的搜索命令,不仅可以按照文件名搜索文件,还可以按照权限、大小、时间、inode 号等来搜索文件。如果使用该命令时,不设置任何参数,则find命令将在当前目录下查找子目录与文件。并且将查找到的子目录和文件全部进行显示。
1.2. find命令格式
find 搜索路径 [选项] 搜索内容
find 是比较特殊的命令,它有两个参数:
- 第一个参数用来指定搜索路径;
- 第二个参数用来指定搜索内容。
详细的命令参数可以通过man手册查找,在此仅列出常用的用法
1.3. 按照文件名或者正则表达式搜索
文件名选项:
- -name: 按照文件名搜索;
- -iname: 按照文件名搜索,不区分文件名大小;
- -inum: 按照 inode 号搜索;
例如,查找/etc/目录下,文件名为httpd.conf的文件
find /etc -name httpd.conf
查找/etc/目录下所有以.conf结尾的文件
find /etc -name *.conf
1.4. 按照文件类型搜索
文件类型选项:
- -type f 普通文件
- -type l 符号连接
- -type d 目录
- -type c 字符设备
- -type b 块设备
- -type s 套接字
- -type p fifo管道文件
例如,查找/dev目录下的块设备文件
find /dev -type b
查找/etc目录下的普通文件
find /etc -type f
1.5. 按照文件大小搜索
文件大小选项:
- -size[±]大小:按照指定大小搜索文件,“+“的意思是搜索比指定大小还要大的文件,”-” 的意思是搜索比指定大小还要小的文件
文件大小单元:
- b 块(512字节)
- c 字节
- w 字(2字节)
- k 千字节
- M 兆字节
- G 吉字节
例如,搜索/var/log目录下大于10M的文件
find /var/log -type f -size +10M
搜索/etc目录下等于4k的文件
find /etc -type f -size 4k
1.6. 按照修改时间搜索
时间选项:
- -atime [±]天,-amin [±]分钟:按照文件访问时间搜索,用户最近一次访问时间。
- -mtime [±]天,-mmin [±]分钟:按照文改时间搜索,文件最后一次修改时间。
- -ctime [±]天,-cmin [±]分钟:按照文件修改时间搜索,文件数据元(例如权限等)最后一次修改时间。
例如,搜索/etc/目录下最近七天内被修改过的所有文件
find /etc -type f -mtime -7
搜索/etc/目录下恰好在七天前被访问过的所有文件
find /etc -type f -atime 7
搜索/etc/目录下超过七天内被访问过的所有文件
find /etc -type f -atime +7
搜索/etc/目录下访问时间超过10分钟的所有文件
find /etc -type f -amin +10
1.7. 按照权限搜索
权限选项:
- -perm 权限模式:査找文件权限刚好等于"权限模式"的文件
- -perm -权限模式:査找文件权限全部包含"权限模式"的文件
- -perm +权限模式:査找文件权限包含"权限模式"的任意一个权限的文件
例如,搜索/etc/目录下权限为000的文件,找的权限必须和指定的权限模式一模一样
find /etc -type f -perm 000
搜索/etc/目录下权限全部包含644的文件,文件的权限必须全部包含搜索命令指定的权限模式
find /etc -type f -perm -664
1.8. 按照所有者和所属组搜索
所有者和所属组选项:
- -uid 用户 ID:按照用户 ID 査找所有者是指定 ID 的文件
- -gid 组 ID:按照用户组 ID 査找所属组是指定 ID 的文件
- -user 用户名:按照用户名査找所有者是指定用户的文件
- -group 组名:按照组名査找所属组是指定用户组的文件
- -nouser:査找没有所有者的文件
例如,搜索/etc/目录下所属组为dnsmasq的文件
find /etc -type f -group dnsmasq
1.9. 按照逻辑运算符
逻辑运算符选项:
- -a:and逻辑与
- -o:or逻辑或
- -not:not逻辑非
例如,搜索/etc/目录下搜索大于2KB,并且文件类型是普通文件的文件
find /etc -size +2k -a -type f
1.10. -exec选项和 -ok选项
exec选项的格式:
find 搜索路径 [选项] 搜索内容 -exec 命令2{} ;
请大家注意这里的"{}“和”;“是标准格式,只要执行”-exec"选项,这两个符号必须完整输入。
“-ok"选项和”-exec"选项的作用基本一致,区别在于:“-exec"的命令会直接处理,而不询问;”-ok"的命令 2 在处理前会先询问用户是否这样处理,在得到确认命令后,才会执行。
例如,使用"-exec"选项,把find命令的结果直接交给"cat"命令处理
find /etc -name httpd.conf -exec cat {} \;
2. crontab
2.1. crontab语法和操作符
Crontab(cron表)是一个定义cron作业时间表的文本文件。Crontab文件可以用crontab命令来创建、查看、修改和删除。
用户crontab文件中的每一行都包含六个字段,用空格隔开,后面是要运行的命令。
* * * * * command(s)
^ ^ ^ ^ ^
| | | | | allowed values
| | | | | -------
| | | | ----- Day of week (0 - 7) (Sunday=0 or 7)
| | | ------- Month (1 - 12)
| | --------- Day of month (1 - 31)
| ----------- Hour (0 - 23)
------------- Minute (0 - 59)
Crontab 字段含义:
- 分钟(0-59):表示一小时内的哪一分钟执行任务。
- 小时(0-23):表示一天内的哪个小时执行任务。
- 日期(1-31):表示一个月内的哪一天执行任务。
- 月份(1-12):表示一年中的哪个月执行任务。
- 星期几(0-7,其中0和7都表示星期天):表示一周中的哪一天执行任务。
字段还可以包含特殊字符:
- *:表示匹配所有可能的值。例如,*在分钟字段中表示每分钟都执行。
- ,:用于指定多个值。例如,1,3,5表示匹配1、3和5。
- -:用于指定一个范围。例如,2-4表示匹配2、3和4。
- /:用于指定一个间隔。例如,/2表示每隔2个单位匹配一次。在分钟字段中,/2表示每2分钟一次。
2.2. 每分钟、每小时、每天、每周定时执行
crontab每分钟定时执行
*/1 * * * * command
crontab每小时定时执行
0 */1 * * * command
crontab每天定时执行
0 0 * * * command //每天0点执行
crontab每周定时执行
0 0 * * 1 command //每周一0点执行
2.3. 每周一、三、五的上午10点和下午3点执行任务
每周一、三、五的上午10点和下午3点执行任务
0 10,15 * * 1,3,5 command
2.4. 每月的1号和15号执行任务
0 0 1,15 * * command
2.5. 每隔3天执行一次任务
0 0 */3 * * command
2.6. 每小时的第15分钟执行任务,但在周末不执行
15 * * * 1-5 command
3. 定时清理
3.1 日志清理脚本
vim /opt/autoclean.sh
#!/bin/bash
dockerlog=/var/lib/docker/volumes/
syslog=/var/log/
cd $dockerlog
find ./ -name '*.log*' -mtime +7 -type f -size +1G -exec rm -fr {} \;
find ./ -name '*.log*' -mtime +30 -exec rm -fr {} \;
cd $syslog
find ./ -name '*.log*' -mtime +7 -type f -size +1G -exec rm -fr {} \;
find ./ -name '*.log*' -mtime +30 -exec rm -fr {} \;
chmod +x /opt/autoclean.sh
3.2 定时执行脚本
每周日的0点执行任务
0 0 * * * 7 /opt/autoclean.sh
4. 参考文献
- https://www.cnblogs.com/jiftle/p/9707518.html
- https://c.biancheng.net/view/779.html
- https://www.cnblogs.com/lcword/p/17723085.html
- https://blog.csdn.net/xaiodang/article/details/108773804
- https://cloud.tencent.com/developer/article/2336089
