【问题标题】:HP-Unix: C-shell:Disk space checkingHP-Unix:C-shell:磁盘空间检查
【发布时间】:2015-12-16 23:52:06
【问题描述】:

我有 10 个使用 hp-ux 的设备,我想检查每个设备的磁盘空间。 我的要求是如果空间超过 90%,设备和空间的信息将被保存到日志中。 这是我设置为变量 ipadd 的设备和 IP 地址列表:

lo1 100.45.32.43
lot2 100.45.32.44
lot3 100.45.32.44
lot4 100.45.32.45
lot5 100.45.32.46 
and so on..

到目前为止,这是我的脚本:

#!/bin/csh -f

set ipaddress = (`awk '{print $2}' "ipadd"`)
set device = (`awk '{print $1}' "ipadd"`)

@ j = 1
while ($j <= $#ipaddress)
   echo $ipaddress
   set i = 90        # Threshold set at 90%
   set max = 100
   while ($i <= $max)         
      rsh $ipaddress[$j] bdf | grep /dev/vg00 | grep $i% \
      |awk '{   file=substr($6,index($6,"/") + 1,length($6)); print "WARNING: $device[$j]:/" file " has reached " $5 ". Perform HouseKeeping IMMEDIATELY..." >> "/scripts/space." file ".file"}'    
      @ i++
   end
   @ j++
end

bdf 之后的输出:

/dev/vg00/lvol2    15300207 10924582 28566314   79% /
/dev/vg00/lvol4      42529   23786   25510   55% /stand

执行脚本后终端的输出:

100.45.32.43
100.45.32.44

.file 处的输出:

WARNING: $device[$j]:/ has reached 79%. Perform HouseKeeping   IMMEDIATELY...

我的问题是,我的循环是否有问题,因为我的 .file 输出只显示一个设备而只迭代一次? 为什么 $device[$j] 没有出现在 .file 输出中? 还是awk有问题?

感谢您的建议。

【问题讨论】:

  • 你可以试试这里:serverfault.com
  • 您在每个主机上执行 11 rshs - 效率不高!我会重新考虑解决方案。 $device[$j] 按原样打印,因为它位于 awk '...' 内部(单引号 - 无扩展)。

标签: unix diskspace


【解决方案1】:

您的代码针对 90 到 100 之间的每个可能百分比进行了测试。

大概,您可以接受检查一次并询问“设备百分比是否大于 90%”的代码?那么你根本不需要内部循环,每台机器只建立一个连接,试试

#!/bin/csh -f

set ipaddress = (`awk '{print $2}' "ipadd"`)
set device = (`awk '{print $1}' "ipadd"`)
@ j = 1
set i = 90        # Threshold set at 90%
while ($j <= $#ipaddress)
   echo $ipaddress
   echo "#dbg: ipaddress[$j]=${ibpaddress[$j]}"
   rsh $ipaddress[$j] bdf \
   | awk -v thresh="$i" -v dev="$device[$j]" \
      '/\/dev\/vg00/ { \
          sub(/%/,"",$5) \
          if ($5 > thresh) { \
           file=substr($6,index($6,"/") + 1,length($6)) \
           print "WARNING: " dev ":/" file " has reached " $5 ". Perform HouseKeeping IMMEDIATELY..." >> "/scripts/space." file ".file" \
       }\
     }'    
   @ j++
end

抱歉,我没有可用于 dbl-chk 的 csh 用于语法错误。

因此,这是我们确定在您的环境中工作的单线。

rsh $ipaddress[$j] bdf | nawk -v thresh="$i" -v dev="$device[$j]" '/\/dev\/vg00/ { sub(/%/,"",$5) ; if ($5 > thresh) { file=substr($6,index($6,"/") + 1,length($6));print "#dbg:file="file; print "WARNING: " dev ":/" file " has reached " $5 ". Perform HouseKeeping IMMEDIATELY..." >> "/scripts/space.file.TMP" } }'

我没有可用的bdf 系统。在sub()if 测试中更改对$5 的两个引用,以匹配具有您要测试的百分比的输出的字段编号。

请注意,-v var="value" 是将变量值从 shell 传递到用单引号括起来的 awk 脚本的标准方法。

请注意,行尾的任何“\”字符都是最后一个字符,没有尾随空格或制表符,否则您将收到难以理解的错误消息。 ;-)

IHTH

【讨论】:

  • 脚本中包含'\'?
  • @larrey :是的,实际上,因为我没有 csh 来测试,我的记忆现在告诉我 awk 脚本的每一行都应该有一个 '\' 字符也是。如果您遇到语法错误,请告诉我。
  • @larrey :查看每个 awk 行的带有 '\' 的版本。我找到了我的一个旧的csh 脚本,现在我很确定每个换行符都需要在末尾有延续字符('/')。嗯,我现在注意到您使用的是HP-Unix。所以我的经验是使用 Sun,我知道 2 个 Unix 版本之间存在显着差异。我想我已经写了一个非常“普通”的解决方案,但可能存在我不知道的陷阱 ;-) 使用 cmets 向我发送错误消息。
  • 并且您确定行尾的“\”之后没有尾随空格/制表符?如果是这样,请尝试将awk 脚本折叠到一行。现在我有了新的认识,我将查看我的帖子,看看是否需要任何其他修复。
  • 如果您将awk 脚本折叠到一行,则删除“\”字符。对于其中的某些行,您需要 ; 来分隔 cmd。 . . . "",$5) ; if ... AND ...length($6)) ; print ...
猜你喜欢
  • 2017-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多