前言
我们常常会在代码中添加打印日志,用于排查生成环境的问题。服务器日志文件一般是每天一个或多个文件,如果日志文件不清理,时间久了就会将磁盘空间占满,从而影响系统的正常运行。平时我们可以手动清理日志文件,但在节假日可能就不太方便了,那该怎么办呢?用shell脚本检查存储空间快满了来清理前几天的日志文件是一个比较好的解决方案。
分析磁盘空间占用情况
df 命令
df 命令以磁盘分区为单位查看文件系统中磁盘空间的使用情况。
语法:df [选项] [文件|目录]
选项:
-h 或 --human-readable :将信息以人类可读的形式打印。
-i 或 --inode :查看分区inode使用情况。
示例:
du命令
查看指定目录的磁盘空间使用情况。
du 命令会递归地计算指定目录下所有文件和子目录的磁盘使用量,并将结果显示出来。
语法:du [选项] [文件|目录]
选项:
-a或--all : 列出所有的文件和目录容量大小而不仅仅列出目录容量大小。
-s或--summarize : 仅显示总计,只列出最后加总的值。
-h或--human-readable : 以K,M,G为单位,提高信息的可读性。
-c或--total : 除了列出文件和目录的容量大小外,最后在列出总容量。
--max-depth=N : 递归显示(仅仅是显示)时的递归深度小于等于N。--max-depth=0相当于-s参数。
-d 数字 :递归深度设置,效果与--max-depth=N相同。
示例:
[root@VM-0-152-tencentos ~]# du -h --max-depth=1 /home/test/www/test-metrics-web/
5.4G /home/test/www/test-metrics-web/logs
5.7G /home/test/www/test-metrics-web/
shell脚本文件
编写清理日志文件的shell 脚本:clear_logs.sh
#!/bin/bash
# 设置日志文件所在目录
LOG_DIR="/home/test/www/test-metrics-web/logs"
# 设置保留日志的天数
DAYS_TO_KEEP=1
echo "delete file starting"
# 查找所有超过期限的日志文件列表,并保存到clear_log_file.txt
find "${LOG_DIR}" -name "*.log" -type f -mtime +"${DAYS_TO_KEEP}" > ${LOG_DIR}/clear_log_file.txt
# 遍历需要清除的日志文件列表
cat ${LOG_DIR}/clear_log_file.txt|while read fileName
do
# 删除日志文件
rm -f $fileName
echo "Deleted file: ${fileName}"
done
脚本授权
chmod +x clear_logs.sh
crontab
crontab命令简介
在Linux系统中,crontab命令是一个用于执行定时任务的命令,crond(crontab)是系统默认自带的定时服务。我们可以通过编辑crontab文件来设置定时任务,使系统可以自动按照设定的时间和频率执行命令。crontab文件通常保存在/etc/crontab和/var/spool/cron目录下。
linux定时任务分类
Linux 系统下的任务调度分为两类:系统任务调度 和 用户任务调度。
系统任务调度:系统周期性所要执行的工作,比如写缓存数据到硬盘、日志清理等。在/etc目录下有一个crontab文件,这个就是系统任务调度的配置文件。
/etc/crontab文件包括下面几行:
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# 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
用户任务调度:用户自定义的定期要执行的工作,用户可以使用 crontab 工具来定制自己的计划任务,所有用户自定义的crontab 文件都被保存在 /var/spool/cron目录中。其文件名与用户名一致,例如我用root用户设置了一个定时任务,那么其对应的crontab文件就是 /var/spool/cron/root。
crontab命令允许用户提交、编辑或删除相应的作业。每一个用户都可以有一个crontab文件来保存调度信息。系统管理员可以通过cron.deny 和 cron.allow 这两个文件来禁止或允许。
/etc/cron.deny 该文件中所列用户不允许使用crontab命令
/etc/cron.allow 该文件中所列用户允许使用crontab命令
/var/spool/cron/ 所有用户crontab文件存放的目录,以用户名命名
总结:系统级别的定时任务crontab文件是/etc/crontab,用户自定义的定时任务其crontab文件保存在 /var/spool/cron/ 目录下,名字和用户名一致。
定时任务设置
直接输入命令crontab -e 或者编辑文件/etc/crontab 就可以直接设置定时任务。
crontab -e //若命令是root用户执行,建议直接使用编辑/etc/crontab的方式
或者
vi /etc/crontab
crontab -e
*/1 * * * * /home/test/www/test-metrics-web/clear_logs.sh > /home/test/www/test-metrics-web/logs/logfile.log 2>&1
说明: crontab -e 会进入编辑模式,当输入的命令格式正确后会保存到/var/spool/cron目录下,以当前用户命名;
定时任务格式
我们看到/etc/crontab文件中有如下格式
# 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
分钟 小时 日期 月份 星期 (crontab表达式)
user-name 指的是执行这个定时任务的用户
command to be executed : 运行的命令
示例:每分钟以root用户执行/root/1.sh脚本
* * * * * root bash /root/1.sh
每个字段代表的含义如下:
minute: 表示分钟,可以是从0到59之间的任何整数。
hour:表示小时,可以是从0到23之间的任何整数。
day:表示日期,可以是从1到31之间的任何整数。
month:表示月份,可以是从1到12之间的任何整数。
week:表示星期几,可以是从0到7之间的任何整数,这里的0或7代表星期日。
command:要执行的命令,可以是系统命令,也可以是自己编写的脚本文件。
在以上各个字段中,还可以使用以下特殊字符:
星号(*):代表所有可能的值,例如month字段如果是星号,则表示在满足其它字段的制约条件后每月都执行该命令操作。
逗号(,):可以用逗号隔开的值指定一个列表范围,例如,“1,2,5,7,8,9”
中杠(-):可以用整数之间的中杠表示一个整数范围,例如“2-6”表示“2,3,4,5,6”
正斜线(/):可以用正斜线指定时间的间隔频率,例如“0-23/2”表示每两小时执行一次。同时正斜线可以和星号一起使用,例如*/10,如果用在minute字段,表示每十分钟执行一次。
注意:在 crontab 命令中只有 “绝对路径”,不存在相对路径,故执行任何命令都需要写绝对路径
启动服务
cron是linux的内置服务,但它不自动起来,可以用以下的方法启动、关闭这个服务:
service crond start //启动服务
service crond stop //关闭服务
service crond restart //重启服务
service crond reload //重新载入配置
service crond status //查看crontab服务状态
设置开机自动启动
# 查询开机自启动服务,enabled 是开机启动,disabled 是开机不启动.
systemctl list-unit-files | grep crond
# 设置开机自启动
systemctl enable crond
# 设置开机不启动
systemctl disable crond
[root@VM-0-152-tencentos test-metrics-web]# systemctl list-unit-files | grep crond
crond.service enabled enabled
cron定时任务的执行日志
cron定时任务执行日志文件在: /var/log/cron
实例
案例1:要求每分钟执行一次 以root用户执行test.sh脚本
*/1 * * * * root /bin/bash /root/test.sh
案例2:要求每天的凌晨3点执行一次 执行 touch /tmp/testfile.txt命令
0 3 * * * /usr/bin/touch /tmp/testfile.txt
案例3:要求每天上午7,9,12点各执行一次
0 7,9,12 * * * /app/Projects/bin/start.sh -config=/data/application.yml >> /data/info.log 2>&1
案例4:要求在每天上午的7点每隔2分钟执行一次(0分钟的时候执行)
*/2 7 * * * echo "Have a good dream" >> /tmp/test.txt