自动检测文件何时达到大小限制

自动检测文件何时达到大小限制

我想在文件达到一定大小限制时发送电子邮件。

我想到的唯一方法是执行一个 cronjob,它将检查文件大小并在文件大于所需大小时发送电子邮件。

然而,对我来说添加一个 cronjob 似乎是一个糟糕的解决方案,它会检查(例如每 15-30 分钟)文件的大小?

我想知道是否有更好的方法来自动检测文件何时附加一些文本(事件?),以便我可以检查大小并进行所需的处理。

答案1

我可以想到两种方法来做到这一点。您可以使用 while 循环,该循环将以某个设定频率运行“stat”命令,执行检查以查看文件的大小是否超出了您所需的大小。如果有,请发送电子邮件。此方法可以,但可能有点低效,因为无论文件上是否有事件,它都会以设定的时间频率运行“stat”命令。

另一种方法涉及使用文件系统事件,您可以使用命令订阅观察者inotifywatch

方法 #1 - 每 X 秒示例

如果将以下内容放入脚本中,请说notify.bash

#!/bin/bash

file="afile"
maxsize=100    # 100 kilobytes

while true; do
    actualsize=$(du -k "$file" | cut -f1)
    if [ $actualsize -ge $maxsize ]; then
        echo size is over $maxsize kilobytes
        .... send email ....
        exit
    else
        echo size is under $maxsize kilobytes
    fi

    sleep 1800 # in seconds = 30 minutes
done

然后运行它,它将报告对文件的任何访问,如果该访问导致文件大小超过您的最小大小,它将触发发送电子邮件并退出。否则,它将报告当前大小并继续观看文件。

方法 #2 - 仅检查访问示例

更有效的方法是仅在实际访问时检查文件。访问类型可能有所不同,在本示例中,我将说明如何仅监视文件访问,但您只能监视其他事件,例如文件被关闭。我们再次命名该文件notify.bash

#!/bin/bash

file=afile
maxsize=100 # 100 kilobytes

while inotifywait -e access "$file"; do
    actualsize=$(du -k "$file" | cut -f1)
    if [ $actualsize -ge $maxsize ]; then
        echo size is over $maxsize kilobytes
        .... send email ....
        exit    
    else
        echo size is under $maxsize kilobytes
    fi
done

运行此脚本将产生以下输出:

$ ./notify.bash 
Setting up watches.
Watches established.

在文件上生成一些活动,文件现在报告其大小,如下所示:

$ seq 100000 > afile
$ du -k afile 
576 afile

我们的通知脚本的输出:

afile ACCESS 
size is over 100 kilobytes

此时它将退出。

发送电子邮件

要执行此活动,您只需在脚本中执行类似以下操作:

subject="size exceeded on file $file"
emailAddr="[email protected]"
mailCmd="mail -s \"$subject\" \"$emailAddrs\""
( echo ""; echo "DATE: $(date)"; ) | eval mail -s "$subject" \"$emailAddr\"

注意事项

第二种方法适用于大多数情况。一种情况是,如果$maxsize调用脚本时文件已超过 ,并且类型 的文件上没有进一步的事件,则不会发生这种情况access。这可以通过在调用脚本时在脚本中执行附加检查或扩展所inotifywatch作用的事件来解决。

参考

相关内容