在应用疯狂打日志的情况下,服务器很容易被塞满磁盘。可以写一个shell脚本, 再加上crontab定时器, 达到定期清理日志文件的目的, 防止日志文件占用过多磁盘空间。

一、编写shell脚本, 

1.先编写一个删除日志的shell脚本。
        要求:该脚本需要能够被手动执行成功,并且可以实现删除指定目录下日志文件的目标,且不能删除其他目录下文件,  基础脚本示例如下。

#! /bin/bash

#find:linux的查找命令,用户查找指定条件的文件;
#/opt/soft/log/:想要进行清理的任意目录;
#-mtime:标准语句写法;
#+3:查找3天前的文件,这里用数字代表天数;
#"*.log":希望查找的数据类型,"*.jpg"表示查找扩展名为jpg的所有文件,"*"表示查找所有文件,这个可以灵活运用,举一反三;
#-exec:固定写法;
#rm -rf:强制删除文件,包括目录;
# {} \; :固定写法,一对大括号+空格+\+; 

echo "del file start....."

#find /home/logs/ -mtime +3 -name "*.log"  -exec rm -rf {} \;
find /home/tomcat/apache-tomcat-8.0.52/logs -mtime +0 -name "*.log.*"  -exec rm -rf {} \;
find /home/tomcat/apache-tomcat-8.0.52/logs -mtime +0 -name "*.out.*"  -exec rm -rf {} \;
find /root/logs/islife -mtime +0 -name "*.log"  -exec rm -rf {} \;
find /home/yw/logs  -mtime +1 -name "*.log*"  -exec rm -rf {} \;
> /usr/local/tomcat7/logs/catalina.out;

echo "del file end"

2、高级脚本示例:

#! /bin/bash

#这里配置tomcat的根路径
script_abs=$(readlink -f "$0")
tomcat_home=$(dirname $script_abs)
 
#当前时间
currTime=$(date +"%Y-%m-%d %T")
 
#需要删除的日志文件所在目录
#绝对路径
logpath=/home/tomcat/apache-tomcat-8.0.52/logs
#相对路径
#logpath=$tomcat_home/logs
 
#删除日志的记录所在目录
outpath=/home/tomcat/apache-tomcat-8.0.52/historycleanlog
#outpath=$tomcat_home/historycleanlog

#删除需要使用绝对目录
#find ./logs -name "*.log" -exec rm -rf {} \;
#find $tomcat_home/logs -name "*-05-19.log" -exec rm -rf {} \;

#进入日志目录
cd $logpath
 
 
echo $currTime " 清理日志脚本执行开始 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>">> ${outpath}

#7天之前的日志文件删除
#获取7天之前的日期
del_date=`date +%Y-%m-%d -d "7 days ago"`


######################################################################
# 日志定时运行时间建议为每天运行
# 删除7天之前的日志文件
# 日志文件时间是根据日志名称后面的日期来计算
# 运行脚本注意日志文件中是否有其他相同后缀的非日志文件和日志文件名称是否符合要求
# 其日志格式必须为 :pro-debug-0-2021-05-13.log , 即 *2021-05-13.log
######################################################################

#获取文件名中的日期字符串,然后对比时间进行相应的操作
for n in `ls *.log -1`;do
    m=`echo $n | awk -F. '{print $(NF-1)}'`
    m=`echo ${m:0-10}`
    if [ ! $m ]; then
        continue
    fi
    if [[ $m < $del_date || $m = $del_date ]];then
        echo "file" $n "will be deleted." >> ${outpath}/catalina.out
        rm -rf $n
    fi
done
 
echo $currTime" 清理日志脚本执行结束 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>">> ${outpath}/catalina.out
echo "       ">> ${outpath}/catalina.out

然后要启动linux的crontab来定时运行这个脚本,从而达到定时删除日志文件的目的。

二、设置定时器crontab, 定期执行脚本, 定期删除日志文件(Linux)

1、将清理日志的shell脚本放在服务上,并给该文件授权。 chmod +x cleanlog.sh
       一般放到tomcat或者web容器下面。

2、将脚本添加到定时任务crontab

crontab -e:编辑当前用户的定时任务
            1) 编辑添加定时任务:10,54 * * * * /home/tomcat/apache-tomcat-8.0.52/cleanlog.sh
               (crontab实例说明请参考下文)    定时执行的脚本文件的位置
            2)添加好后,按ESC,输入":wq"存盘退出;
            3)需要重新启动 crontab让定时任务生效, 命令: service crond restart

crontab -l:查看当前用户的定时任务,出现以下目录说明定时任务已经添加成功
            10,54 * * * * /home/tomcat/apache-tomcat-8.0.52/cleanlog.sh
crontab -r:删除当前用户的定时任务
            ==> 从/var/spool/cron目录中删除用户的crontab文件 
            ==> 如果不指定用户,则默认删除当前用户的crontab文件 crontab –i 在删除用户的crontab文件时给确认提示

3、重新启动crontab 让定时任务生效,命令:service crond restart

4、crontab实例说明:
        crontab:定时任务的守护进程,精确到分,设计秒的我们一般写脚本  -->相当于闹钟

实例0:每晚的23:30执行一次 cleanlog.sh脚本
30 23 * * * /home/tomcat/apache-tomcat-8.0.52/cleanlog.sh

实例1:每1分钟执行一次cmd
* * * * * cmd

实例2:每小时的第3和第15分钟执行
3,15 * * * * cmd
  
实例3:在上午8点到11点的第3和第15分钟执行
3,15 8-11 * * * cmd

实例4:每隔两天的上午8点到11点的第3和第15分钟执行
3,15 8-11 */2  *  * cmd
  
实例5:每周一上午8点到11点的第3和第15分钟执行
3,15 8-11 * * 1 cmd
  
实例6:每晚的21:30执行
30 21 * * * cmd

实例7:每月1、10、22日的4 : 45执行
45 4 1,10,22 * * cmd

实例8:每周六、周日的1 : 10执行
10 1 * * 6,0 cmd

实例9:每天18 : 00至23 : 00之间每隔30分钟执行
*/30 18-23 * * * cmd

实例10:每星期六的晚上11 : 00 pm执行
0 23 * * 6 cmd

实例11:每一小时执行
0 */1 * * * cmd

实例12:晚上11点到早上7点之间,每隔一小时执行
0 23-7 * * * cmd

5、crontab文件内容分析

cat /etc/crontab

HELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/

# 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
59 15 * * * /usr/local/zjport_test/delFiles/delFiles_192.168.3.134.sh >dev/null 2>&1

 -----

前四行是用来配置crond任务运行的环境变量

第一行SHELL变量指定了系统要使用哪个shell,这里是bash

第二行PATH变量指定了系统执行命令的路径

第三行MAILTO变量指定了crond的任务执行信息将通过电子邮件发送给root用户

如果MAILTO变量的值为空,则表示不发送任务执行信息给用户

第四行的HOME变量指定了在执行命令或者脚本时使用的主目录。

小 结:
    数字的表示最好用2为阿拉伯数字显示
    周和日最好不要同时用
    定时任务要加注解
    可以定向到日志文件或者空文件
    定时任务一定是绝对路径,且目录必须存在才能出结果
    crontab 服务一定要开启运行

# crontab时间问题
最关键的,只有 5 个参数,没有 秒 参数。所以跟标准cron定时表达式不一样

三、linux安装crontab定时器

1、安装命令及查看状态

安装crontab:yum install crontabs

查看crontab服务状态:service crond status

2、crontab服务操作说明:

/sbin/service crond start //启动服务
/sbin/service crond stop //关闭服务
 
/sbin/service crond restart //重启服务(编辑定时任务需要重启生效)/sbin/service crond reload //重新载入配置

3、查看crontab服务是否已设置为开机启动,执行命令:

方法一: 界面启动      ntsysv 
方法二: 加入开机自动启动:   chkconfig –level 35 crond on

ntsysv的操作方法:类图形界面管理模式来设置开机启动。(RedHat特有的,基本上chkconfig就很好用了。)
总结一下功能按钮:
上下键:可以在中间的方框当中,在各个服务之间移动;
空格键:可以用来选择你所需要的服务,[*]表示开起启动;
tab键:可以在方框、OK、Cancel之间移动;
[F1]键:可以显示该服务的说明。

4、备份crontab文件
crontab -l > $HOME/mycron

5、恢复丢失的crontab文件

如果不小心误删了crontab文件,假设你在自己的$HOME目录下还有一个备份,那么可以将其拷贝到/var/spool/cron/<username>,其中<username>是用户名。
如果由于权限问题无法完成拷贝,可以用:crontab <filename>其中,<filename>是你在$HOME目录中副本的文件名。
有些crontab的变体有些怪异,所以在使用crontab命令时要格外小心。如果遗漏了任何选项,crontab可能会打开一个空文件,或者看起来像是个空文件。
这时敲delete键退出,不要按<Ctrl-D>,否则你将丢失crontab文件。
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐