我正在尝试为学校作业编写一个脚本,该脚本将检查是否有任何非管理用户主目录的大小在 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
几点建议:
du -skh ${DIR}
会产生类似于 的结果23M Example/
,而您可能希望它只是一个数字,稍后可以进行计算。也许可以使用 来cut
删除目录名称,并且不要使用 -h,因为您想要一个计算机可读的数字,而不是人类可读的数字。DIFF=$((SIZE-NEW_SIZE))
看起来不对。尝试DIFF=`expr $NEW_SIZE - $SIZE`
然后,您可能想要测试 DIFF 的值与 100MB 之类的值,即 100000000 字节(多或少):
[[ $DIFF -ge 100000000 ]]
“如果 DIFF 的值大于或等于 100000000 字节...”
这取决于您的操作系统,尤其是测试的标志。我不记得是哪个了,但我认为 Mac 使用 -g 表示大于,而 linux 使用 -gt。我认为 -ge 总是大于或等于。谷歌一下。
也许将每 20 分钟片段的目录大小存储在日志文件中会更容易,然后将脚本附加到日志文件并将其与上一个日志条目进行比较。然后,您可以将其作为直接的 cronjob 而不是持续作业来运行while sleep
。不过可能会更麻烦一些。