shell实例浅谈之十四利用crontab自动清除日志

一、问题

      linux下运行程序有时会产生大量的记录日志,以便排除隐藏很深的问题,但时间一长就会占用很多的磁盘空间。每天手动清除也比较麻烦,因此一个定时脚本执行是很有必要的。

二、详解

(1)删除文件shell命令

find 对应目录 -mtime +天数 -name "文件名" -exec rm -rf {} \;

实例命令:

find /opt/soft/log/ -mtime +30 -name "*.log" -exec rm -rf {} \;

说明:

将/opt/soft/log/目录下所有30天前带".log"的文件删除。具体参数说明如下:

find:linux的查找命令,用户查找指定条件的文件;

/opt/soft/log/:想要进行清理的任意目录;

-mtime:标准语句写法;

+30:查找30天前的文件,这里用数字代表天数;

"*.log":希望查找的数据类型,"*.jpg"表示查找扩展名为jpg的所有文件,"*"表示查找所有文件,这个可以灵活运用,举一反三;

-exec:固定写法;

rm -rf:强制删除文件,包括目录;

{} \; :固定写法,一对大括号+空格+\+;

(2)crontab计划任务

创建shell脚本:

#vim del-30-days-ago-log.sh

输入:

#!/bin/sh
find /opt/soft/log/ -mtime +30 -name "*.log" -exec rm -rf {} \;

然后分配可运行权限,执行:

#chmod +x del-30-days-ago-log.sh

加入到系统计划任务:

#crontab -e

#10 0 * * * /opt/soft/log/del-7-days-ago-log.sh >/dev/null 2>&1

设置的是每天凌晨0点10分执行del-7-days-ago-log.sh文件进行数据清理任务了。

(3)其他自动清除日志脚本

#!/bin/sh
###########################
#delete log blog.duplicatedcode.com
# in_day_num: like 1 2 is delete 2day ago logs
# in_log_path like tomcat log home
###########################
in_log_path=${1}
in_day_num=${2}
tmp_delete_log=/var/log/deletelog/"`date +%Y%m`.log"

deleteLog()
{
    inner_num=${1}
   #find log
   echo "[`date`] >> start delete logs---" >> $tmp_delete_log
   find ${in_log_path} -type f -mtime ${inner_num} -print0 | xargs -0 rm -rf
   echo "[`date`] >> end delete logs---" >> $tmp_delete_log
}
init()
{
   mkdir -p /var/log/deletelog/
}
main()
{
   init
   if [ -z ${in_log_path} ]; then
       echo "[`date`] >> error log_path not init---" >> $tmp_delete_log
       return
   fi
   inner_day_num=+7
   if [[ -n ${in_day_num} ]] && [[ ${in_day_num} -ge 1 ]] ; then
       ${inner_day_num}=${in_day_num}
    else
        ${inner_day_num}="+"${in_day_num}
   fi
   deleteLog ${inner_day_num}
}
#first run main
main
       其中可输入日志所在目录和删除时间(如数字1代表1天前),find -type f -print 时会根据换行或者空格来输出查找的文件,在不同的sh下有不同的反应,如果不做处理结合xargs 进行删除操作,会有影响,所以需要增加-print0用 null来作为边界符号,才敢结合 xargs -0来格式化输入。使用find 的时候 遵循最小结果集原则,find解析式从左到右,所有确保你在最左边的过滤符号能够过滤最大数据。
       该脚本可结合crontab进行自动部署清理日志,在/var/log/deltelog/ 生成按照月的清理日志记录。

(4)Linux下自动清理/tmp文件夹的原理

          Linux系统中/tmp文件夹里面的文件会被清空,至于多长时间被清空,如何清空的?
         在linux中
tmpwatch命令的作用是删除一段时间内不使用的文件(removes files which haven’t been accessed for a period of time),在/etc/cron.daily/tmpwatc的计划任务中:
#! /bin/sh
flags=-umc
/usr/sbin/tmpwatch "$flags" -x /tmp/.X11-unix -x /tmp/.XIM-unix \
        -x /tmp/.font-unix -x /tmp/.ICE-unix -x /tmp/.Test-unix \
        -X '/tmp/hsperfdata_*' 10d /tmp
/usr/sbin/tmpwatch "$flags" 30d /var/tmp
for d in /var/{cache/man,catman}/{cat?,X11R6/cat?,local/cat?}; do
    if [ -d "$d" ]; then
        /usr/sbin/tmpwatch "$flags" -f 30d "$d"
    fi
done

tmpwatch参数

-a或–all  删除任何类型的文件。

-m或–mtime   根据文件被更改时间

-c或–ctime     根据文件更改状态时间

-M或–dirtime  根据文件夹被更改时间

-f或–force  强制删除文件或目录,其效果类似rm指令的”-f”参数。

-l  不删除符号链接

-U或–exclude-user=用户名或uid  排除某用户的文件

-x 或–exclude=path 排除某路径

-X 或–exclude-pattern=pattern 排除某规则下的路径

-q或–quiet  不显示指令执行过程。

-v或–verbose  详细显示指令执行过程。

-test  仅作测试,并不真的删除文件或目录。

第一行相当于一些标记(参数),第二行就是针对/tmp目录里面排除的目录,第三行,这是对这个/tmp目录的清理。
/usr/sbin/tmpwatch "$flags" 30d /var/tmp中30d是30天, 系统自动清理/tmp文件夹的默认时限是30天 ,决定了30天清理/tmp下不访问的文件,若想一天一清理的话,把30d改成1d。
如果你设置更短的时间来清理的话,比如说是30分钟、10秒等,在这个文件中设置后,reboot后时间到了也不清理/tmp文件夹里面的内容,因为tmpwatch所在的位置是/etc/cron.daily/目录下,而这个目录是每天执行一次计划任务,所以就不起作用了。

三、总结

(1)crontab定时任务在文件清理方面又很大的应用,可以设置关机任务、启动脚本和一些程序的检测操作。

(2)清除日志可采用cat /dev/null > /var/lig/messages,可以防止rm -f导致的程序已经打开文件句柄无法正确释放日志文件和写入、文件显示磁盘空间未释放等问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

乌托邦2号

博文不易,支持的请给予小小打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值