我想在文件达到一定大小限制时发送电子邮件。
我想到的唯一方法是执行一个 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
作用的事件来解决。