我正在尝试使用 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%\%}
;这是六个对六个。