#!/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
当前代码的问题:
我需要从第二行到最后一行的列进行比较,但我当前的代码正在比较第一行的列,这就是为什么我认为它不起作用。如何解决问题?
这里的答案是不使用
-H
。正如其中记录的man df
那样,它旨在作为“人类可读的输出”,并且单位可以有意改变。请改用固定单位:默认 KB 或 MB (
-m
)。您可能还想了解 Nagios (Icinga)。这是一个监视工具,其中包含用于准确处理您正在处理的监视类型的脚本。
这是因为
if awk ...
always返回true,因为awk
总是成功结束,除非它在尝试执行其脚本时遇到错误(未找到文件、语法错误等),或者脚本以特定的非零状态退出我倾向于考虑这样写脚本