如果目录大小​​超过阈值则触发

如果目录大小​​超过阈值则触发

我编写了一个 shell 脚本来将数据备份到 s3,我想在系统存储空间变得紧张时触发此 shell 脚本,比如当系统容量达到 80% 时。我知道有类似 watch 的实用程序可以监控系统大小,但它们是级别触发器,即定期监控。我想要的是一个边缘触发器(一种回调、触发器),它会在上述定义的条件下激活。在基于 debian 的系统上编写此类触发器的最佳方法是什么。请建议使用 bash、C、C++、python 或 java 的方法。

我所说的边缘触发是指,每当系统状态处于关键状态(即使用率超过 80%)时,就应该生成触发器。我不想每隔 1 小时轮询一次来检查状态。

让我详细说明一下我的用例。每次请求(通过 get 或 post api)时,请求主体都会被推送到 kafka。假设 kafka 出现故障,那么日志就会写入系统,现在我有一个脚本,它仅在系统状态危急时才在 s3 上轮换日志。

在这种情况下,正如您所见,kafka 不会经常宕机。假设它每 6 个月宕机一次,那么每隔 1 小时检查一次目录大小只是浪费资源。这就是我想要一个边缘触发器的原因。

我还遇到了一项称为 inotify 的服务。只是想知道这是我们能做的最好的事情吗(性能方面)?

请帮忙

谢谢

答案1

如果您想要定期检查,比如每次重启或每个月的星期二,您可以设置一个 cron 作业,调用您的备份脚本,然后您可以在备份脚本本身中检查文件系统的使用情况。可以像这样简单地完成:

if [ $(df / --output=pcent | awk -F '%' 'NR==2{print $1}') -ge 80 ] ; 
then 
   # do something here 
fi 

这基本上会调用df命令,输出限制为百分比使用和/文件系统,并修剪输出以便仅返回百分比。如果百分比大于或等于 80 ,它将执行您在注释后放置的任何内容# do something here

如果您想要持续运行解决方案,这里有一个 Python 脚本,每 0.25 秒检查一次文件系统使用情况。我为编写了一个简单的包装函数subprocess.check_output,因此您可以使用它轻松地以字符串列表的形式在那里调用您的脚本(基本上是这样的['brackets', 'and' , 'quotes'] :)

#!/usr/bin/env python
import subprocess
import time
import sys

def run_cmd(cmdlist):
    # function for running 
    try:
        stdout = subprocess.check_output(cmdlist)
    except subprocess.CalledProcessError:
           pass
    else:
        if stdout:
            return  stdout

fs_usage = ""

while True:
    fs_usage = run_cmd( "df / --output=pcent".split() )
    if int(fs_usage.split("\n")[1].strip().split("%")[0]) >= 80 :
        # make call to your backup script here !
        # Use list format
        run_cmd( [ 'notify-send','Hello','World'  ]  )
        sys.exit(1)
    time.sleep(0.25)

相关内容