#!/bin/bash
df -m > myfile
server_ip_address=$(ip addr show $(ip route | awk '/default/ { print $5 }') | grep "inet" | head -n 1 | awk '/inet/ {print $2}' | cut -d'/' -f1)
if awk '$2 > 10000 && $5 > 90' myfile ; then
echo "Disk Full in $server_ip_address"
else
echo "Nothing wrong with the server"
fi
当我执行脚本时,输出总是显示磁盘已满? df -m 的输出如下所示:
Filesystem 1M-blocks Used Available Use% Mounted on
/dev/mapper/centos-root 949305 512827 436479 55% /
devtmpfs 3811 0 3811 0% /dev
tmpfs 3823 0 3823 0% /dev/abc
tmpfs 3823 18 3806 1% /run
tmpfs 3823 0 3823 0% /sys/fs/cgroup
/dev/sda2 1014 175 840 18% /boot
/dev/sda1 1022 12 1011 2% /boot/efi
tmpfs 765 0 765 0% /run/user/2000
df -m 的输出因服务器而异。因此,我比较 Size>10GB 和 Use%>90%。由于某些大小 <10GB 的磁盘对于磁盘使用率低于 90% 可能并不重要。
更新1:
GNU bash,版本 4.2.46(2)-release (x86_64-redhat-linux-gnu)
操作系统是centos 7
当前代码的问题:
我需要从第二行到最后一行的列进行比较,但我当前的代码正在比较第一行的列,这就是为什么我认为它不起作用。如何解决问题?
答案1
我当前代码中的问题是 df -H 的输出并不总是以 GB 为单位
这里的答案是不使用-H
。正如其中记录的那样,man df
它旨在作为“人类可读的输出”,并且单位可以有意改变。
请改用固定单位:默认 KB 或 MB ( -m
)。
您可能还想了解 Nagios (Icinga)。这是一个监视工具,其中包含用于准确处理您正在处理的监视类型的脚本。
当我执行脚本时,始终将磁盘已满作为输出
这是因为if awk ...
always返回true,因为awk
总是成功结束,除非它在尝试执行其脚本时遇到错误(未找到文件、语法错误等),或者脚本以特定的非零状态退出
我倾向于考虑这样写脚本
#!/bin/sh
myIP=$(
ip -j route |
jq -r '.[] | select(.dst == "default") | .gateway'
)
df=$(
df -lm -x tmpfs |
awk '
NR==1 { header=$0 }
$5+0 > 90 { if (length(header)) { print header; header="" }; print }
'
)
if [ -n "$df" ]
then
echo "Problems with server $myIP"
echo
echo "$df"
else
echo "Disk space seems ok on $myIP"
fi