구성 파일을 사용한 파일 시스템 모니터링

구성 파일을 사용한 파일 시스템 모니터링

쉘 스크립트를 사용하여 파일 시스템 공간을 모니터링하려고 합니다. 스크립트는 경고 상태 제약 조건이 포함된 구성 파일을 참조해야 합니다. 구성 파일은 다음과 같습니다

FileSYSTEM  WARNING     CRITICAL
/dev/sda5   80  90
/dev/sda3   50  70
/dev/sda2   60  75
/dev/sda1   75  80
tmpfs       70  75

따라서 스크립트를 실행할 때마다 df -Ph의 사용 비율을 해당 프로필과 비교하고 이에 따라 경고(또는) 중요한 메일을 트리거해야 합니다.

내가 시도한 스크립트는 다음과 같습니다

#!/bin/ksh
HOST=`hostname`
DATE=`date`
LOGDIR=/home/oracle/files/logs
CONFIG_FILE=/home/oracle/files/template

FILESYSTEM=`mount -l | egrep -v 'root'| awk '{print $3}'`

for i in $FILESYSTEM
do
df -Ph $i > ($LOGDIR)\FS.log
sed -e '/Filesystem/d' -e 's/\%/ /g' ${LOGDIR}/FS.log > ${LOGDIR}/FS1.log
SPACEUSED=$(awk '{print $5}' ${LOGDIR}/FS1.log)

while read -r line
do
FS_TEMPLATE=`awk {'print $1'}`
if ($i == $FS_TEMPLATE)
then
WARNING_LIMIT=`awk {'print $3'}`
CRITICAL_LIMIT=`awk {'print $2'}`
if ($SPACEUSED == $CRITICAL_LIMIT)
then
echo ' mail criticality'
elseif ($SPACEUSED -ge $WARNING_LIMIT)
then
echo 'waning'
fi
fi
done < $CONFIG_FILE
done


# Remove temporary work files.
rm -f ${LOGDIR}/FS.log
rm -f ${LOGDIR}/FS1.log

# End of Script

하지만 작동하지 않습니다. 어떻게 구현할 수 있나요?

답변1

이것실패하다예를 들어 필드를 선택해 보셨나요?

CRITICAL_LIMIT=`awk {'print $2'}`

어떤 조언도 제공하지 않습니다 . 분명히 OR ( ksh bash zsh 에서)을 awk원 하고 if 구문이 잘못되었습니다. 산술 비교가 필요하고 문자열 비교를 위해서는 완전히 다른 것이 필요 합니다 . 더 서투른 것:echo $line|<<<$line(( ))elifelseif

  • 원래는 include 마운트 라인만 제외했습니다 root. 루트 파일 시스템의 공간 사용량을 모니터링하고 싶습니다. 그러나 오늘날 거의 모든 시스템에는 저장되지 않은 파일 시스템이 여러 개 있으므로 모니터링할 공간 사용량이 없습니다. /proc일반적으로 /sys또는 /dev그 중 일부, 때로는 다른 경우도 있습니다. 파일 시스템을 지정하지 않고 실행 하면 df의미 있는 모든 작업이 수행됩니다. 더 좋은 점은 구성 파일의 파일 시스템에만 관심이 있으므로 그게 전부라는 것입니다.

  • read각 줄마다 어색하게 나누려고 하는데 언제 awk무료 read로 할 수 있나요?

  • 사용량이 임계값과 같을 때만 테스트하려고 합니다. 예를 들어 "/dev/sda5"가 79%에서 81%로 빠르게 증가하는 경우 논리는 80%에서 경고를 발행하지 않습니다. 사람들은 사용량이 도달하면 알림을 받기를 원합니다.또는 그 이상임계값.

  • {중괄호는 쉘(적어도 대부분의 쉘)에 대한 특수 문자이고 예상치 못한 원치 않는 결과가 발생할 수 있기 때문에 스크립트에서는 따옴표 안에 넣어야 합니다. 그러나 특정 경우 에는 그렇지 않습니다.}awk

그리고 실제로 어떤 것도 메일로 보내려고 시도하지 않았지만 이는 대개 시스템과 환경에 따라 달라지므로 이에 대해서는 여러분에게 맡기겠습니다.

내가 원하는 모든 것을 적용하십시오:

#!/bin/ksh
CONFIG_FILE=/home/oracle/files/template
<$CONFIG_FILE while read filesys warn crit; do
  used=$( df -Ph "$filesys" | awk 'NR>1 {sub(/%/,"",$5);print $5}' )
  if (($used >= $crit)); then echo critical $used% on $filesys
  elif (($used >= $warn)); then echo warning $used% on $filesys; fi
done 

또는 %필드 5를 유지하고 을 사용한 다음 잘린 값 ${used%\%}(6 대 6)을 비교할 수 있습니다.

관련 정보