背景
linux服务器每隔一段时间就提示空间不存。
问题定位
通过命令查找大文件后发现是 nacos 访问日志过大导致。
解决方案
使用 crontab 编写定时任务,定期删除指定目录下的指定文件。
linux版本
[root@localhost ~]# cat /proc/version
Linux version 3.10.0-957.el7.x86_64 (mockbuild@kbuilder.bsys.centos.org) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-36) (GCC) )
[root@localhost ~]# cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)
检查crontab服务
使用 systemctl status crond 命令检查服务是否正常运行,输入命令后显示以下结果即证明服务运行。
[root@localhost ~]# systemctl status crond
● crond.service - Command Scheduler
Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor preset: enabled)
Active: active (running)
编写定时任务删除脚本
注意:需要删除的文件目录及匹配规则可根据实际情况而定。
新建目录
用于存放当前用户下的自定义定时任务脚本
mkdir -p /home/myCron;
新建文件
touch /home/myCron/delete_nacos_access_log.sh;
授予可执行权限
chmod +x /home/myCron/delete_nacos_access_log.sh;
编写删除脚本
vim /home/myCron/delete_nacos_access_log.sh
键入键盘的 i 键 ,粘贴 脚本,然后键入以下内容,键入的 esc 键,shift+: ,输入 wq 后 回车保存。
# ===== shell begin =====
# 定时删除 大于指定间隔的 nacos 日志 数据
# nacos 日志文件的位置,可根据实际情况调整
nacos_log_path=/home/nacos/logs;
# 间隔天数,可根据实际情况调整
delete_nacos_log_interval=6;
# nacos 日志文件通用前缀
nacos_log_file_prefix=access_log.;
# nacos 日志文件通用后缀
nacos_log_file_suffix=.log;
# 当天的时间
now_date=`date +%Y-%m-%d`;
# 声明一个数组,用于存储不需要删除的文件信息
declare -a not_delete_file_arr;
# 获得间隔时间内的文件名称,即不需要删除的文件列表
for ((i=0; i<$delete_nacos_log_interval; i++))
do
not_delete_file_arr[$i]=$nacos_log_path'/access_log.'`date -d "-$i day " +%Y-%m-%d`'.log';
done
# 查找当前目录下所有符合要求的文件
exist_nacos_log_file_str=`find $nacos_log_path -name $nacos_log_file_prefix*$nacos_log_file_suffix`;
#要将$a分割开,可以这样:
OLD_IFS="$IFS"
IFS=","
exist_nacos_log_file_str_arr=($exist_nacos_log_file_str)
IFS="$OLD_IFS"
# 查找需要删除的文件并执行删除操作
for exist_name in ${exist_nacos_log_file_str_arr[@]}
do
isNeedDelete=1;
for not_delete_name in ${not_delete_file_arr[@]}
do
# 删除备份
if [ $exist_name = $not_delete_name ]; then
isNeedDelete=0;
break;
fi;
done;
if [ $isNeedDelete = 1 ]; then
echo $now_date' =》删除文件:'$exist_name;
rm -rf $exist_name;
fi;
done;
# ===== shell end =====
vim 用法参考:https://www.runoob.com/linux/linux-vim.html
模拟日志文件
批量新建模拟文件
touch /home/nacos/logs/access_log.2022-02-{1..24}.log;
查看模拟文件
[root@localhost ~]# cd /home/nacos/logs
[root@localhost logs]# ls -l
access_log.2022-02-10.log
access_log.2022-02-11.log
access_log.2022-02-12.log
access_log.2022-02-13.log
access_log.2022-02-14.log
access_log.2022-02-15.log
access_log.2022-02-16.log
access_log.2022-02-17.log
access_log.2022-02-18.log
access_log.2022-02-19.log
access_log.2022-02-1.log
access_log.2022-02-20.log
access_log.2022-02-21.log
access_log.2022-02-22.log
access_log.2022-02-23.log
access_log.2022-02-24.log
access_log.2022-02-2.log
access_log.2022-02-3.log
access_log.2022-02-4.log
access_log.2022-02-5.log
access_log.2022-02-6.log
access_log.2022-02-7.log
access_log.2022-02-8.log
access_log.2022-02-9.log
将脚本添加至定时任务中
crontab -e
# 添加以下脚本并保存(时间可自行调整),并删除记录日志
0 12 * * * /home/myCron/delete_nacos_access_log.sh >> /home/myCron/delete_nacos_access_log.log 2>&1;
# 重载定时任务
systemctl restart crond;
# 查看编写的定时任务
crontab -l;
0 12 * * * /home/myCron/delete_nacos_access_log.sh >> /home/myCron/delete_nacos_access_log.log 2>&1;
注意:Linux crontab 命令参考:https://www.runoob.com/linux/linux-comm-crontab.html
Linux Crontab 定时任务参考: https://www.runoob.com/w3cnote/linux-crontab-tasks.html
查看定时任务执行结果
# 只保留最近6天的日志
access_log.2022-02-18.log
access_log.2022-02-19.log
access_log.2022-02-20.log
access_log.2022-02-21.log
access_log.2022-02-22.log
access_log.2022-02-23.log
小结
# 定时任务表达式位置:/var/spool/cron/用户名
cat /var/spool/cron/root
# 查看 定时任务列表
crontab -l
# 编辑 定时任务列表
crontab -e
# 重启定时任务列表,或使用 systemctrl restart crond
service crond restart
# 查看 crontab 执行日志
cat /var/log/cron
# 查看crontab 执行情况:/var/spool/mail/用户名
cat /var/spool/mail/root