2023年7月21日发(作者:)
【Shell】定期⾃动删除log或其他指定⽂件清理磁盘空间(实测)⼀、【Shell】定期⾃动删除log或其他指定⽂件清理磁盘空间(可⽤)⼀些软件在长期运⾏的过程中会产⽣⼀些log或info⽂件,时间久了会占⽤很多磁盘空间,可以通过shell脚本+crontab定时任务的⽅式,定期⾃动清理这些⽂件以腾出磁盘空间,脚本如下:#!/bin/bashfind /log/test_logs/ -mtime +10 -type f -name "*.log" | xargs rm -f1、脚本说明: - find /log/test_logs/需要操作的⽬录 - -mtime +10只保留最近⼗天,或者操作针对于⼗天之前的⽂件,在这就是删除⼗天之前的⽂件 - -type f指定操作类型为⽂件,⽂件为f,⽬录为d - -name “*.log”指定操作的⽂件是什么,在这⾥我们仅操作指定⽬录下以.log结尾的⽂件,根据具体的需求修改 - xargs rm -f做删除操作脚本运⾏之前:脚本运⾏之后:可以看到,符合要求的10天之前的以.log结尾的⽂件都会被清理掉,其他⽂件因为不满⾜时间限制或者不满⾜⽂件名限制,都不会被删掉2、设置计划任务脚本写好之后,最好直接设置为计划任务,由系统定期⾃动执⾏,如,在每天晚上的1:00⾃动执⾏清理脚本00 01 * * * /root/log_计划任务的设置最好与系统中原存在的计划任务错开⼀定的时间,避免占⽤过多的资源或其他冲突,设置计划任务,注意给脚本加权限CentOS以普通⽤户运⾏脚本1、如在Oracle⽤户下添加定时任务su - oracle (⾸先切换到oracel⽤户)crontab -e
30 2 * * * oracle /backup/oracledata/2、配置⽂件存在于/var/spool/cron,只⽤root⽤户可访问该⽬录cd /var/spool/cron包括oracle和root两个⽤户的定时任务配置⽂件然后 vi oracle ,可看到步骤⼀中配置的定时任务可在上述⽂件中添加多个定时任务。3、重启定时任务:sudo service crond restart(oracel本⾝没有权限执⾏该命令,需赋予权限后⽤sudo执⾏,权限赋予见常见问题6)4、查看当前⽤户的定时任务:crontab -l5、删除当前⽤户的定时任务:crontab -r6、每条任务调度执⾏完毕,系统都会将任务输出信息通过电⼦邮件的形式发送给当前系统⽤户,路径 为:/var/spool/mail/oracle 查看最近100⾏内容: tail -n 100 /var/spool/mail/oracle。这样⽇积⽉累,⽇志信息会⾮常⼤,可能会影响系统的正常运⾏,因此,将每条任务进⾏重定向处理⾮常重要。 例如,可以在crontab⽂件中设置如下形式,忽略⽇志输出: 30 2 * * * /backup/orcldata/ >/dev/null 2>&1“/dev/null 2>&1”表⽰先将标准输出重定向到/dev/null,然后将标准错误重定向到标准输出,由于标准输出已经重定向到了/dev/null, 因此标准错误也会重定向到/dev/null,这样⽇志输出问题就解决了。7、⽇志路径:/var/log/cron, 内容如下图:Ubuntu以普通⽤户运⾏脚本1、如在Oracle⽤户下添加定时任务su - oracle (⾸先切换到oracel⽤户)vi /etc/crontab30 2 * * * oracle oracle /backup/oracledata/注意 :执⾏脚本的⽤户和执⾏的内容属主,是否属于执⾏者2、配置⽂件存在于/var/spool/cron,只⽤root⽤户可访问该⽬录cd /var/spool/cron包括oracle和root两个⽤户的定时任务配置⽂件然后 vi oracle ,可看到步骤⼀中配置的定时任务3、重启定时任务:sudo service crond restart (oracel本⾝没有权限执⾏该命令,需赋予权限后⽤sudo执⾏,权限赋予见常见问题6)crontab -e -u www4、查看当前⽤户的定时任务:crontab -l查看指定⽤户的定时任务:crontab -l -u appadmin实例在tmp⽬录创建要删除的临时⽂件root@ubuntu:~# cd /tmproot@ubuntu:/tmp# lsroot@ubuntu:/tmp# vi 脚本内容 :root@ubuntu:~# vi #!/bin/bashset -uset -efind /tmp/ -type f -name "*.tmp" | xargs rm -froot@ubuntu:~# chmod +x @ubuntu:~# ./ #执⾏脚本,⽴刻删除tmp⽬录下的临时⽂件。注意:set -u 是检测tmp⽬录是否存在tmp⽂件,然后再执⾏脚本。root@ubuntu:~# service cron start
start: Job is already running: cronroot@ubuntu:~# service cron status 查看cron状态cron start/running, process 1501root@ubuntu:~# service cron stop #先停⽌cron服务,再启动服务cron stop/waitingroot@ubuntu:~# service cron start
cron start/running, process 1530⼆、shell脚本定期删除⽇志⽂件对于linux系统,实现起来很⽅便:⼀个删除脚本 + crontab就可实现这个⽬标1. 创建⾃动清理⽇志的sheel脚本(假定log⽇志在⽬录/var/app下),#!/bin/bashsearchPath=/var/appcd ${searchPath}
declare -i total=`ls .* | wc -l`declare -i nums=$total-7
if [ "${nums}" -ge 1 ];then rm -rf `ls -tr .* | head -${nums}`fi2. 赋予脚本可执⾏权限chmod +x 3.采⽤crontab创建定期任务每天凌晨1点执⾏(假定清除脚本在⽬录/var/app下),编辑crontab,增加如下⾏:00 01 * * * /var/app/让改动的crontab⽴即⽣效sudo /etc/init.d/cron restart这样就⼤功告成,此脚本每天凌晨就会启动⼀次,⾃动删除7天前备份的log⽂件。或者直接执⾏下⾯命令#rm -rf `ls .* -t |tail -n +8`或者crontab -ei 编辑如下* 20 * * * rm -rf /home/algo/workspace/log/*三、 shell脚本:定期删除⽇志⽂件2服务器中产⽣的⽇志有时会占满硬盘空间,因此需要定时对其清除。下⾯写了个脚本,实现删除上⼀个⽉的⽇志。#!/bin/bashyy=`date +%Y` #获取年mm=`date +%m` #获取⽉,如果是9⽉,得到的是09;如果是10⽉得到的是10#mm=1#echo ${mm}if [ ${mm} -eq 1 ] #如果是1⽉份,其前⼀⽉是前⼀年的12⽉份then preYY=$(($yy-1))
preMM=12;else preYY=${yy} #preMM=$((${mm}-1)) preMM=`expr $mm - 1` #由于有时是09,所以做减法必须要这么写,但是得到的结果却是8fipreMM=`printf %02d ${preMM}` #由于上⼀步有可能得到⼀位数,所以需要前⾯补0,如08#echo ${preYY} ${preMM}#df -h#⽂件系统 容量 已⽤ 可⽤ 已⽤% 挂载点#/dev/sda5 46G 25G 19G 58% /#none 4.0K 0 4.0K 0% /sys/fs/cgroup#udev 1.9G 4.0K 1.9G 1% /dev#tmpfs 385M 1.5M 383M 1% /run#none 5.0M 0 5.0M 0% /run/lock#none 1.9G 976K 1.9G 1% /run/shm#none 100M 32K 100M 1% /run/user#下⾯这⼀句,得到第5列第2⾏中的58%的58percent=`df -h | awk '{print $5}' | head -2 | tail | grep -oP 'd+'`echo ${percent}if [ ${percent} -gt 80 ]then #echo "⼤于80%" rm -rf /home/fan/shell/localhost_access_log.${preYY}-${preMM}*fi解释:grep -oP-o:只显⽰满⾜正则表达式的部分(-o, –only-matching show only the part of a line matching PATTERN)-P:PATTERN 是⼀个 Perl 正则表达式2.定时执⾏⽐如:每10分钟执⾏⼀次vi /etc/crontab
*/10 * * * * sh /path/to/解释:前5个*分别表⽰,分钟 ⼩时(24制) ⽇ ⽉ 年*/10 * * * *表⽰每10分钟执⾏⼀次update 20160608上⾯的获取前⼀个⽉的逻辑写了这么多,其实只需要⼀⾏就可以搞定:date -d "-1 month" "+%Y-%m-%d"获取前⼀天,前⼀年类似:date -d "-1 day" "+%Y-%m-%d"date -d "-1 month" "+%Y-%m"date -d "-1 year" "+%Y"获取当前时间1⼩时之前的时间:四、shell定时清理⽇志⽂件,只保留⽂件下最近的60个最近发现服务器磁盘空间使⽤超过90%,查看原因是起得服务⽇志很长时间没清理导致的,所以写个脚本,定时清理⽇志⽂件,只保存logs⽂件下最近⽇期的60个⽇志⽂件。脚本如下# vim /testweb/shell/#!/bin/bashDIR=/testwebFILE_BAK=file_bak# 定时清理⽇志,保留最近⽇期的60个⽂件ls -1t $DIR/apache-tomcat-web/logs/* | awk 'NR>60 {print "rm -f "$0}' | bashls -1t $DIR/apache-tomcat-manager/logs/* | awk 'NR>60 {print "rm -f "$0}' | bashls -1t $DIR/apache-tomcat-uc/logs/* | awk 'NR>60 {print "rm -f "$0}' | bash创建定时任务# crontab -e# 每天凌晨,执⾏脚本,定时清理⽇志,保留最近⽇期的60个⽂件0 0 * * * /bin/sh /testweb/shell/五、防⽌误删脚本set 命令关于set 命令有较多参数,这⾥介绍最常⽤的⼏个-e : 遇到未正确执⾏的命令⽴刻退出-u : 遇到未定义的变量,报错(但是不会退出)-x : 相当于bash -x ,⽤于调试命令-f : 取消通配符案例 :实例写⼀段脚本删除safe⽬录下所有⽂件:错误写法 :最终,脚本都变成了rm -rf * ,可怕⾄极为保证不错删东西 ,我们加⼀个set -u 选项 ,判断变量是否存在vim 执⾏结果 :删除报错,由于没有指定删除的⽬录set -e 与set -u 通常搭配在⼀起使⽤⼀个是遇到错误退出,⼀个是发现空变量报错04 总结1、删⽂件其实不⽤rm -rf ,不是受迫性需要,不要使⽤rm -rf2、修改、删除系统⽂件或其他重要的东西,先备份⼀份3、⾮特殊需要,不建议在root下操作,普通⽤户即可4、脚本加上set -e 与set -u保证安全使⽤实例:实例1:每1分钟执⾏⼀次command* * * * * command实例2:每⼩时的第3和第15分钟执⾏3,15 * * * * command实例3:在上午8点到11点的第3和第15分钟执⾏3,15 8-11 * * * command实例4:每隔两天的上午8点到11点的第3和第15分钟执⾏3,15 8-11 */2 * * command实例5:每个星期⼀的上午8点到11点的第3和第15分钟执⾏3,15 8-11 * * 1 command实例6:每晚的21:30重启smb30 21 * * * /etc/init.d/smb restart实例7:每⽉1、10、22⽇的4 : 45重启smb45 4 1,10,22 * * /etc/init.d/smb restart实例8:每周六、周⽇的1 : 10重启smb10 1 * * 6,0 /etc/init.d/smb restart实例9:每天18 : 00⾄23 : 00之间每隔30分钟重启smb0,30 18-23 * * * /etc/init.d/smb restart实例10:每星期六的晚上11 : 00 pm重启smb0 23 * * 6 /etc/init.d/smb restart实例11:每⼀⼩时重启smb* */1 * * * /etc/init.d/smb restart实例12:晚上11点到早上7点之间,每隔⼀⼩时重启smb* 23-7/1 * * * /etc/init.d/smb restart实例13:每⽉的4号与每周⼀到周三的11点重启smb0 11 4 * mon-wed /etc/init.d/smb restart实例14:⼀⽉⼀号的4点重启smb0 4 1 jan * /etc/init.d/smb restart实例15:每⼩时执⾏/etc/⽬录内的脚本01 * * * * root run-parts /etc/实例16:每天早上6点10分10 6 * * * date
实例17:每两个⼩时0 */2 * * * date
实例18:晚上11点到早上8点之间每两个⼩时,早上8点0 23-7/2,8 * * * date
实例19:每个⽉的4号和每个礼拜的礼拜⼀到礼拜三的早上11点0 11 4 * mon-wed date
实例20:1⽉份⽇早上4点0 4 1 jan * date
范例$crontab -l 列出⽤户⽬前的crontab.说明:run-parts这个参数了,如果去掉这个参数的话,后⾯就可以写要运⾏的某个脚本名,⽽不是⽬录名了参考链接 :
发布者:admin,转转请注明出处:http://www.yc00.com/news/1689930861a295260.html
评论列表(0条)