쉘 스크립트를 사용하여 파일 시스템 공간을 모니터링하려고 합니다. 스크립트는 경고 상태 제약 조건이 포함된 구성 파일을 참조해야 합니다. 구성 파일은 다음과 같습니다
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
((
))
elif
elseif
원래는 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)을 비교할 수 있습니다.