Jea*_*ard 9 linux cron email shell-script files
我想在文件达到特定大小限制时发送电子邮件。
我想到的唯一方法是做一个 cronjob,它会检查文件大小并在文件大于所需大小时发送电子邮件。
但是,对于我来说,添加一个 cronjob 来检查(例如每 15-30 分钟)文件的大小似乎是一个糟糕的解决方案?
我想知道是否有更好的方法来自动检测文件何时附加了一些文本(事件?),以便我可以检查大小并进行所需的处理。
slm*_*slm 10
我可以想到两种方法来做到这一点。您可以使用 while 循环,它会以某个设定的频率运行“stat”命令,执行检查以查看文件的大小是否超过了您想要的大小。如果有,则发送电子邮件。这种方法是可以的,但可能有点低效,因为无论文件上是否有事件,它都会以设置的时间频率运行“stat”命令。
另一种方法是使用文件系统事件,您可以使用命令订阅观察者inotifywatch
。
如果您将以下内容放入脚本中,请说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
Run Code Online (Sandbox Code Playgroud)
然后运行它,它将报告对文件的任何访问,如果该访问导致文件的大小超过您的最小大小,它将触发发送电子邮件并退出。否则,它将报告当前大小并继续观看文件。
更有效的方法是仅在实际访问时检查文件。访问的类型可能会有所不同,在本示例中,我将说明如何仅监视文件访问,但您只能监视其他事件,例如文件被关闭。我们再次将这个文件命名为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
Run Code Online (Sandbox Code Playgroud)
运行此脚本将产生以下输出:
$ ./notify.bash
Setting up watches.
Watches established.
Run Code Online (Sandbox Code Playgroud)
在文件上生成一些活动,文件现在报告它的大小如下:
$ seq 100000 > afile
$ du -k afile
576 afile
Run Code Online (Sandbox Code Playgroud)
我们的通知脚本的输出:
afile ACCESS
size is over 100 kilobytes
Run Code Online (Sandbox Code Playgroud)
在这一点上它会退出。
要执行此活动,您只需在脚本中执行以下操作:
subject="size exceeded on file $file"
emailAddr="user@somedom.com"
mailCmd="mail -s \"$subject\" \"$emailAddrs\""
( echo ""; echo "DATE: $(date)"; ) | eval mail -s "$subject" \"$emailAddr\"
Run Code Online (Sandbox Code Playgroud)
第二种方法在大多数情况下都有效。一个不会的情况是,如果$maxsize
调用脚本时文件已经超过,并且类型为 的文件上没有进一步的事件access
。这可以通过在脚本被调用时在脚本中执行的额外检查或通过扩展作用的事件来补救inotifywatch
。