11 disk-usage shell-script text-processing
我想在我的服务器上实现一个脚本,如果磁盘使用率超过 90%,它将自动发送电子邮件警报,并在超过 95% 时自动发送第二封电子邮件警报。我的文件系统是abc:/xyz/abc
,挂载点是/pqr
.
我试过这个:
ADMIN="someone@def.com"
ALERT=90
df -H | grep -vE 'abc:/xyz/pqr | tmpfs |cdrom' | awk '{ print $5 " " $1 }' | while read output; do
usep=$(echo $output | awk '{ print $1}' | cut -d'%' -f1 )
partition=$(echo $output | awk '{ print $2 }' )
if [ $usep -ge $ALERT ]; then
mail -s "Alert: Almost out of disk space $usep" $ADMIN
fi
done
Run Code Online (Sandbox Code Playgroud)
但我收到一个错误,上面写着
line 7: [: Use: integer expression expected
Run Code Online (Sandbox Code Playgroud)
Gil*_*il' 13
错误是由于参数之一-ge
不是数字。由于$ALERT
始终是数字,$usep
因此必须是罪魁祸首。解析输出的方式存在几个问题dh
,导致$usep
不是数字。
根据文件系统的长度,dh
可以将其输出分成几行。部分行将被过滤器捕获并导致无意义的数据。要避免这种行为并从 获得可解析的输出dh
,请传递该-P
选项。
还df
打印一个标题行,这将再次导致无意义的数据。
您的过滤器非常复杂。我会使用一次 awk。就此而言,您可以对 awk 中的百分比进行过滤(但我在以下脚本中没有这样做)。
df -H | awk '
NR == 1 {next}
$1 == "abc:/xyz/pqr" {next}
$1 == "tmpfs" {next}
$1 == "/dev/cdrom" {next}
1 {sub(/%/,"",$5); print $1, $5}
' | while read filesystem percentage; do
if [ "$percentage" -ge "$ALERT" ]; then
mail -s "Alert: Almost out of disk space ($usep%) on $filesystem" "$ADMIN"
fi
done
Run Code Online (Sandbox Code Playgroud)
NR==1
匹配第一行,所以NR==1 {next}
跳过第一行。接下来的几行排除了一些文件系统(请注意,您的描述说您对 感兴趣abc:/xyz/pqr
,但您的代码排除了它)。最后 awk 行在%
打印之前从百分比列中删除。
发送一封关于所有文件系统的邮件会更好。这次我用awk做所有的分析。
message=$(df -h | awk -v ALERT="$ALERT" '
NR == 1 {next}
$1 == "abc:/xyz/pqr" {next}
$1 == "tmpfs" {next}
$1 == "/dev/cdrom" {next}
1 {sub(/%/,"",$5)}
$5 >= ALERT {printf "%s is almost full: %d%%\n", $1, $5}
')
if [ -n "$message" ]; then
echo "$message" | mail -s "Alert: Almost out of disk space" "$ADMIN"
fi
Run Code Online (Sandbox Code Playgroud)
小智 6
如果使用 %d 将 print 更改为 printf,则百分比将变为整数。尝试:
printf("%d", $5);
Run Code Online (Sandbox Code Playgroud)
这会将 91% 转换为 91。所以最终命令是这样的:
df -H | grep /dev/xvde1 | awk '{ printf "%d", $5}'
Run Code Online (Sandbox Code Playgroud)
上面的英文命令: “以人类可读的格式获取磁盘空间使用情况。使用 grep 过滤到我们想要查看的磁盘。将该行管道输送到 awk 并打印由空格分隔的第 5 个单词(删除空字符),然后格式化结果字符串为整数。对我来说,命令返回整数78
,这意味着磁盘已满 78%。