监控用户主目录过度增长

监控用户主目录过度增长

我正在尝试为学校作业编写一个脚本,该脚本将检查是否有任何非管理用户主目录的大小在 20 分钟内增加了超过 100 MB。

如果任何用户的主目录增加了 100 MB 以上,则向 root 发送电子邮件。这需要自动化例程。

这是我目前所做的:

#!/bin/bash
#

DIR=`ls -d /home/*`
Size=0
for DIR in $DIR
do
   Size[index]=`du -skh ${DIR}`

done

 while sleep 5; do      
   for DIR in $DIR
  do
    NEW_SIZE=0
    NEW_SIZE=`du -skh ${DIR} `
    DIFF=$((SIZE-NEW_SIZE))
    echo $DIFF  
      if [ $DIFF -eq 0 ]
      then
          mail -s "Subject" root
     fi

    done
done

但我收到以下语法错误:

错误:第 19 行:580K:值对于基数来说太大(错误标记为“580K”)

我究竟做错了什么?

答案1

许多问题:

  • for DIR in $DIR改变 的值$DIR。第一次执行时可能有效,但第二次执行此语句时, $DIR将是最后的目录中/home,而不是整个列表。
    • 为什么不直接说呢for DIR in /home/*
  • index从未设置。
  • 这是无害的,但没有理由在下一行NEW_SIZE=0设置另一个值之前进行设置。NEW_SIZE
  • SIZE从未设置。

您可能想学习一些基本的调试技术。

答案2

几点建议:

  1. du -skh ${DIR}会产生类似于 的结果23M Example/,而您可能希望它只是一个数字,稍后可以进行计算。也许可以使用 来cut删除目录名称,并且不要使用 -h,因为您想要一个计算机可读的数字,而不是人类可读的数字。

  2. DIFF=$((SIZE-NEW_SIZE))看起来不对。尝试DIFF=`expr $NEW_SIZE - $SIZE`

  3. 然后,您可能想要测试 DIFF 的值与 100MB 之类的值,即 100000000 字节(多或少):[[ $DIFF -ge 100000000 ]]“如果 DIFF 的值大于或等于 100000000 字节...”

这取决于您的操作系统,尤其是测试的标志。我不记得是哪个了,但我认为 Mac 使用 -g 表示大于,而 linux 使用 -gt。我认为 -ge 总是大于或等于。谷歌一下。

也许将每 20 分钟片段的目录大小存储在日志文件中会更容易,然后将脚本附加到日志文件并将其与上一个日志条目进行比较。然后,您可以将其作为直接的 cronjob 而不是持续作业来运行while sleep。不过可能会更麻烦一些。

相关内容