全新的Shell脚本。
在执行SH脚本时,我得到以下异常:
/dev/mapper/VolGroup00-root
./DiskSpace.sh: line 7: [: /dev/mapper/VolGroup00-root: integer expression expected
/ 5.2G
./DiskSpace.sh: line 7: [: /: integer expression expected
29% /dev/xvda1
/dev/mapper/VolGroup00-home
./DiskSpace.sh: line 7: [: /dev/mapper/VolGroup00-home: integer expression expected
/home 5.2G
./DiskSpace.sh: line 7: [: /home: integer expression expected
/dev/mapper/VolGroup00-opt
./DiskSpace.sh: line 7: [: /dev/mapper/VolGroup00-opt: integer expression expected
/opt 5.3G
./DiskSpace.sh: line 7: [: /opt: integer expression expected
/dev/mapper/VolGroup00-var
./DiskSpace.sh: line 7: [: /dev/mapper/VolGroup00-var: integer expression expected
/var 5.3G
./DiskSpace.sh: line 7: [: /var: integer expression expected下面是我要执行的脚本:
#!/bin/sh
df -H | grep -vE '^Filesystem|tmpfs|cdrom' | awk '{ print $5 " " $1 }' | while read output;
do
echo $output
usep=$(echo $output | awk '{ print $1}' | cut -d'%' -f1 )
partition=$(echo $output | awk '{ print $2 }' )
if [ $usep -ge 90 ]; then
echo "Running out of space \"$partition ($usep%)\" on $(hostname) as on $(date)" |
mail -s "Alert: Almost out of disk space $usep%" azrael@opinkerfi.com
fi
done以下是linux系统上df -h的输出:
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/VolGroup00-root
4.8G 1.9G 2.7G 42% /
tmpfs 3.9G 0 3.9G 0% /dev/shm
/dev/xvda1 194M 52M 132M 29% /boot
/dev/mapper/VolGroup00-home
4.9G 1.9G 2.8G 41% /home
/dev/mapper/VolGroup00-opt
5.0G 4.4G 360M 93% /opt
/dev/mapper/VolGroup00-var
5.0G 3.7G 1.1G 78% /var发布于 2015-12-01 04:53:06
我建议将这里的大部分逻辑从外部命令移到shell本身;通过消除对awk、grep和&c的所有不必要调用而节省的性能节省了启动bash的额外成本,而不是/bin/sh。
至于眼前的bug,请确保您的值实际上是整数。这意味着不仅要删除%符号,还要删除任何小数点。此外,使用df -P,以确保符合POSIX的输出(这将确保您的列号实际上是什么,以及您认为它们在哪里)。
#!/bin/bash
ignore_re='^Filesystem|tmpfs|cdrom'
while read -r line; do
[[ $line ]] || continue # skip empty lines
[[ $line =~ $ignore_re ]] && continue
read -r filesystem blocks_total blocks_used blocks_avail cap_pct mounted_at _ <<<"$line"
# below is a noop but makes set -x output more useful
: filesystem="$filesystem" blocks_total="$blocks_total" blocks_used="$blocks_used" blocks_avail="$blocks_avail" cap_pct="$cap_pct" mounted_at="$mounted_at"
usep=${cap_pct%"%"} # trim trailing % sign
usep=${usep%.*} # round (down) to nearest decimal
if (( usep >= 90 )); then
mail -s "Alert: Almost out of disk space $usep%" azrael@opinkerfi.com <<EOF
$filesystem (mounted on $mounted_at) usage is $usep on $(hostname) as of $(date)
EOF
fi
done < <(df -P)如果您的shell是bash4.1或更新版本,您还可以消除对$(date)的外部调用,以支持printf用于调用strftime的新%()T内置。
https://stackoverflow.com/questions/34012765
复制相似问题