使用配置文件进行文件系统监控

使用配置文件进行文件系统监控

我正在尝试使用 shell 脚本监视文件系统空间。该脚本应该引用具有警报状态约束的配置文件。配置文件如下

FileSYSTEM  WARNING     CRITICAL
/dev/sda5   80  90
/dev/sda3   50  70
/dev/sda2   60  75
/dev/sda1   75  80
tmpfs       70  75

因此,每当我运行脚本时,它都应该将 df -Ph 的使用百分比与该配置文件进行比较,并相应地触发警告(或)关键邮件。

我尝试的脚本如下

#!/bin/ksh
HOST=`hostname`
DATE=`date`
LOGDIR=/home/oracle/files/logs
CONFIG_FILE=/home/oracle/files/template

FILESYSTEM=`mount -l | egrep -v 'root'| awk '{print $3}'`

for i in $FILESYSTEM
do
df -Ph $i > ($LOGDIR)\FS.log
sed -e '/Filesystem/d' -e 's/\%/ /g' ${LOGDIR}/FS.log > ${LOGDIR}/FS1.log
SPACEUSED=$(awk '{print $5}' ${LOGDIR}/FS1.log)

while read -r line
do
FS_TEMPLATE=`awk {'print $1'}`
if ($i == $FS_TEMPLATE)
then
WARNING_LIMIT=`awk {'print $3'}`
CRITICAL_LIMIT=`awk {'print $2'}`
if ($SPACEUSED == $CRITICAL_LIMIT)
then
echo ' mail criticality'
elseif ($SPACEUSED -ge $WARNING_LIMIT)
then
echo 'waning'
fi
fi
done < $CONFIG_FILE
done


# Remove temporary work files.
rm -f ${LOGDIR}/FS.log
rm -f ${LOGDIR}/FS1.log

# End of Script

但它不起作用。我怎样才能实现它?

答案1

失败您是否尝试使用例如选择字段

CRITICAL_LIMIT=`awk {'print $2'}`

不提供awk任何意见;您显然想要echo $line|or (在 ksh bash zsh 中)<<<$line,并且您的 if 语法是错误的:您需要(( ))算术比较,以及完全用于字符串比较的其他东西,而elif不是elseif.其他事情比必要的更笨拙:

  • 您最初仅排除挂载行包含root.我想监视根文件系统上的空间使用情况。然而,今天几乎所有系统都有几个未存储的文件系统,因此没有空间使用情况可供监视:/proc通常/sys/dev或者经常是其中的一部分,有时是其他。如果您df在不指定文件系统的情况下运行,它将为您执行所有有意义的文件系统。更好的是,您只关心配置文件中的文件系统,所以只需执行这些即可。

  • 你的read每一行(尝试)笨拙地分割它,awk什么时候read可以免费做到这一点

  • 您(尝试)仅在使用率等于阈值时进行测试;例如,如果“/dev/sda5”从 79% 快速上升到 81%,您的逻辑将不会在 80% 时发出警告。通常人们希望在使用量达到时收到警报或以上一个门槛。

  • 脚本中的and应该放在引号内,因为大括号对于 shell(至少是大多数 shell)来说是特殊字符,并且可能会产生意想不到的和不需要的结果,尽管在您的特定情况下不是{这样}awk

而且您根本没有尝试过实际邮寄任何东西,但这通常取决于系统和环境,所以我将其留给您。

应用所有我会做的:

#!/bin/ksh
CONFIG_FILE=/home/oracle/files/template
<$CONFIG_FILE while read filesys warn crit; do
  used=$( df -Ph "$filesys" | awk 'NR>1 {sub(/%/,"",$5);print $5}' )
  if (($used >= $crit)); then echo critical $used% on $filesys
  elif (($used >= $warn)); then echo warning $used% on $filesys; fi
done 

或者,您可以保留%字段 5 并使用,然后对修剪后的值进行比较${used%\%};这是六个对六个。

相关内容