背景:我有一个备份目录/home/kzy/bakup,会每天备份一些信息。随着日子一天天的过去,这个文件夹越来越大,终于把磁盘撑满了.....

需求:当磁盘占有率超过80%时自动删除该文件夹下最老的30天文件,但要至少保留最近7天的文件。

代码:

如下。(码了一整天啊,才把这么点代码给码出来啊!!!shell编程超级烂啊!!!连基本语法都要查啊!!!各种报错各种调啊!!!为什么我的水平这么烂!!!!!!)

#!/bin/bash
#monitor available disk space
dir='/home/kzy/bakup'
rm_date=
least_retain_date=
threshold=
SPACE=$(df -P| sed -n '/\/$/p' | gawk '{print $5}' | sed 's/%//')
cur_date=$(date "+%Y-%m-%d %H:%M:%S")
echo "==========$cur_date start=========="
if [ $SPACE -ge $threshold ]
then
oldest_file=$(ls -alt| tail -| gawk '{print $9}')
oldest_date=$(stat $oldest_file| grep ^Modify| gawk '{print$2}'| sed 's/-//g')
cur_time=$(date +%s)
oldest_time=$(date -d ${oldest_date} +%s)
diff_time=$(($cur_time - $oldest_time))
diff_date=$(($diff_time / ))
remain_date=$least_retain_date
if [ $(($diff_date-$rm_date)) -ge $least_retain_date ]
then
remain_date=$(expr $diff_date - $rm_date)
fi
cmd="find $dir -mtime +$remain_date -exec rm -rvf {} \;"
echo "Space is use more than $threshold%! Rmove some tmp files!"
echo $cmd
echo "---detail---"
eval $cmd
else
echo "$SPACE% used!"
fi
echo "=======end======="

放在crontab里每天跑就行了,记得保留日志。

------------------------------------细节分割线-----------------------------------

下面,记录一下我学到的各种知识。

1.在我写了一个简单的if 语句后,不停报错Syntax error: “fi” unexpected (expecting “then”

原因:我是在windows下编写的代码,然后拖到linux下面跑的。由于两个平台的格式不同,windows下编辑的代码会有特殊字符,所以运行失败。

解决:在linux下安装dos2unix,运行

dos2unix monitor_disk.sh

后面的是要转换的文件名。

2. 查看磁盘使用情况 df命令

df -hP

结果

Filesystem      Size  Used Avail Use% Mounted on
udev 973M 973M % /dev
tmpfs 199M 26M 174M % /run
/dev/sda1 19G 14G .3G % /
tmpfs 992M 308K 992M % /dev/shm
tmpfs 5.0M .0K 5.0M % /run/lock
tmpfs 992M 992M % /sys/fs/cgroup
cgmfs 100K 100K % /run/cgmanager/fs
none 992M 2.6M 990M % /tmp/guest-gRYtRh
tmpfs 199M 68K 199M % /run/user/
tmpfs 199M 76K 199M % /run/user/
/dev/sr0 71M 71M % /media/zhuwenqian/VMware Tools

参数说明:

-h : 已M、G等单位显示,更便于阅读

-P : 如果没有-P,则在文件路径过长时结果显示会分行,导致难以用脚本处理。加上-P可以保证不换行。

相关命令:查看文件夹占用磁盘空间大小 du -h

3. ls结果按时间排序

ls -alt

如上,加个-t参数就行了

4.变量算数运算

1.用expr

a=
b=
c=$(expr $a - $b) #correct c=6
c=$(expr $a-$b) #error c=9-3

注意一定要有空格

2.用()

a=
b=
d=$(($a - $b)) #correct d=
d=$(($a-$b)) #correct d=

比较推荐第二种,写法,不用担心空格。

注,最外面的$()表示执行命令,里面的($a-$b)是运算式

5.字符串转命令eval

cmd="echo $a"
eval $cmd

6.sed命令

参考:http://man.linuxde.net/sed

7.查询文件修改时间 stat

参考:http://blog.csdn.net/zyz511919766/article/details/14452027

stat  test.txt

【linux】监控磁盘情况并自动删除备份文件的更多相关文章

  1. backup4:数据库自动备份,自动删除备份文件

    一:手写TSQL 脚本 1,自动备份 每周进行一次Database 的 Full Backup,设置 Schedule Interval 为Weekly use master go ) )+N'.ba ...

  2. LINUX学习 - 磁盘分区 + 开机自动挂载 + 性能测试

    在看鸟哥linux私房菜,发现不少有趣的东西,真是相见恨晚. 情境:建立一个新的filesystem挂在/srv/myproject目录下,并让其开机自动挂载到目录,该目录给project群组共享,其 ...

  3. [Linux监控]磁盘空间大小

    echo 192.168.10.69>>ip.list ------------------------------------------- #!/bin/bash #注意if和[]之间 ...

  4. SQL 维护计划(自动删除备份文件)

    --开启修改配置功能 exec sp_configure 'allow updates', 0 --启用功能 sp_configure 'xp_cmdshell',1; reconfigure --临 ...

  5. Linux系统磁盘分区、删除分区、格式化、挂载、卸载、开机自动挂载的方法总结

    Linux系统按照MBR(Master Boot Record)传统分区模式: 注意:传统的MBR(Master Boot Record)分区方式最大只能分2T容量的硬盘,超过2T的硬盘一般采用GPT ...

  6. linux自动删除30天前的日志文件

    linux应用总结: 自动删除n天前的日志文件: . 使用的命令格式如下: find 对应目录 -mtime +天数 -name "文件名" -exec -rm -rf -name ...

  7. linux实现shell脚本监控磁盘内存达到阈值时清理catalina.out日志

    想在服务器上写一个shell脚本,在磁盘使用率达到80%时,自动清理掉一些没有用的日志文件,根据这个想法,在生产环境上写了一个以下脚本,按照该流程,可实现在linux环境做一个定时任务来执行shell ...

  8. Zabbix 自动发现并监控磁盘IO、报警 引言

    引言 Zabbix并没有提供模板来监控磁盘的IO性能,所以我们需要自己来创建一个,由于一台服务器中磁盘众多,如果只有一两台可以手动添加,但服务集群达到几十那就非常麻烦,因此需要利用自动发现这个功能,自 ...

  9. 如何在Linux中自动删除或清理/tmp文件夹内容?

    每个Linux系统都有一个名为的目录/tmp,该目录已挂载了单独的文件系统. 它具有称为tmpfs的特殊文件系统.这是一个虚拟文件系统,操作系统将在系统引导时自动挂载/tmp挂载点. 如果要根据应用程 ...

随机推荐

  1. css 鼠标移上去会变大

    <!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>& ...

  2. StringUtils方法全集(转)

    JAVA对于字符串的操作真是太强大了!!! 在 commons-lang3-3.2.jar 包里 org.apache.commons.lang.StringUtils中方法的操作对象是java.la ...

  3. Java Socket/HttpURLConnection读取HTTP网页

    以读取百度的http网页为例.如果知道了IP地址和端口,然后新建一个Socket,就直接去读百度的首页,根本没反应,原因是www.baidu.com是以http协议传输的,而现在要以Socket原始的 ...

  4. 自学Zabbix3.10.1.5-事件通知Notifications upon events-媒介类型Script

    点击返回:自学Zabbix之路 点击返回:自学Zabbix4.0之路 点击返回:自学zabbix集锦 自学Zabbix3.10.1.5-事件通知Notifications upon events-媒介 ...

  5. Java 8 中 Date与LocalDateTime、LocalDate、LocalTime互转

    Java 8中 java.util.Date 类新增了两个方法,分别是from(Instant instant)和toInstant()方法 // Obtains an instance of Dat ...

  6. Redis常用命令速查 <第二篇>

    一.Key Key命令速查: 命令 说明 DEL 删除给定的一个或多个 key,不存在的 key 会被忽略,返回值:被删除 key 的数量 DUMP 序列化给定 key,返回被序列化的值,使用 RES ...

  7. Meshgrid函数的基本用法(转载)

    在Numpy的官方文章里,meshgrid函数的英文描述也显得文绉绉的,理解起来有些难度. 可以这么理解,meshgrid函数用两个坐标轴上的点在平面上画网格. 用法: [X,Y]=meshgrid( ...

  8. SQL Server 数据库对象命名参考

    一. 引言 编码规范是一个优秀程序员的必备素质,然而,有很多人非常注重程序中变量.方法.类的命名,却忽视了同样重要的数据库对象命名.这篇文章结合许多技术文章和资料,以及我自己的开发经验,对数据库对象的 ...

  9. [机器学习]-SVD奇异值分解的基本原理和运用

    SVD奇异值分解: SVD是一种可靠的正交矩阵分解法.可以把A矩阵分解成U,∑,VT三个矩阵相乘的形式.(Svd(A)=[U*∑*VT],A不必是方阵,U,VT必定是正交阵,S是对角阵<以奇异值 ...

  10. Scala进阶之路-Scala的基本语法

    Scala进阶之路-Scala的基本语法 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.函数式编程初体验Spark-Shell之WordCount var arr=Array( ...