디스크 사용량이 90 %를 초과하는 경우 경고 메일을 보내는 쉘 스크립트


11

디스크 사용량이 90 %를 초과하면 자동으로 이메일 알림을 보내고 95 %를 초과하면 두 번째 이메일 경보를 자동으로 보내는 스크립트를 서버에 구현하려고합니다. 내 파일 시스템이 abc:/xyz/abc있고 마운트 지점이 /pqr입니다.

나는 이것을 시도했다 :

ADMIN="someone@def.com" 
ALERT=90 
df -H | grep -vE 'abc:/xyz/pqr | tmpfs |cdrom' | awk '{ print $5 " " $1 }' | while read output; do 
  usep=$(echo $output | awk '{ print $1}' | cut -d'%' -f1 ) 
  partition=$(echo $output | awk '{ print $2 }' ) 
    if [ $usep -ge $ALERT ]; then 
      mail -s "Alert: Almost out of disk space $usep" $ADMIN 
    fi 
  done

하지만 오류가 발생합니다.

line 7: [: Use: integer expression expected 

답변:


14

인수 중 하나 -ge가 숫자 가 아니기 때문에 오류가 발생했습니다 . $ALERT항상 숫자 이므로 $usep범인이어야합니다. 숫자가 아닌 dh결과 를 구문 분석하는 방법에는 몇 가지 문제점 이 있습니다 $usep.

파일 시스템의 길이에 따라 dh출력을 여러 줄로 나눌 수 있습니다. 필터에서 부분 라인이 포착되어 넌센스 데이터가 생성됩니다. 이 동작을 피하고에서 구문 분석 가능한 출력을 얻으려면 옵션을 dh전달하십시오 -P.

또한 df헤더 라인을 인쇄하여 다시 말도 안되는 데이터를 만듭니다.

필터가 매우 복잡합니다. 나는 awk의 단일 패스를 사용합니다. 그 문제에 대해 awk 내부의 백분율을 필터링 할 수는 있지만 다음 스크립트에서는 수행하지 않았습니다.

df -H | awk '
    NR == 1 {next}
    $1 == "abc:/xyz/pqr" {next}
    $1 == "tmpfs" {next}
    $1 == "/dev/cdrom" {next}
    1 {sub(/%/,"",$5); print $1, $5}
' | while read filesystem percentage; do
    if [ "$percentage" -ge "$ALERT" ]; then 
      mail -s "Alert: Almost out of disk space ($usep%) on $filesystem" "$ADMIN"
    fi 
  done

NR==1첫 줄이므로 일치 NR==1 {next}첫번째 라인을 건너. 다음 몇 줄은 일부 파일 시스템을 제외합니다 (설명에서는 관심이 abc:/xyz/pqr있지만 코드에서 제외한다고 설명합니다). 마지막 awk 행은 %백분율 열을 인쇄하기 전에 백분율 열에서 제거 합니다.

모든 파일 시스템에 대해 하나의 메일을 보내는 것이 좋습니다. 이번에는 모든 분석을 awk로하고 있습니다.

message=$(df -h | awk -v ALERT="$ALERT" '
    NR == 1 {next}
    $1 == "abc:/xyz/pqr" {next}
    $1 == "tmpfs" {next}
    $1 == "/dev/cdrom" {next}
    1 {sub(/%/,"",$5)}
    $5 >= ALERT {printf "%s is almost full: %d%%\n", $1, $5}
')
if [ -n "$message" ]; then
  echo "$message" | mail -s "Alert: Almost out of disk space" "$ADMIN"
fi 

6

% d를 사용하여 print를 printf로 변경하면 백분율이 정수가됩니다. 시험:

printf("%d", $5);

91 %를 91로 변환합니다. 마지막 명령은 다음과 같습니다.

df -H | grep /dev/xvde1 | awk '{ printf "%d", $5}'

영어로 된 위의 명령 : "사람이 읽을 수있는 형식으로 디스크 공간 사용량 가져 오기.보고자하는 디스크로 grep을 사용하여 필터링하십시오. 그 줄을 파이프로 묶어 공백으로 구분 된 다섯 번째 단어를 인쇄하십시오 (빈 상태 제거). 결과 문자열은 정수입니다. 나에게 명령은 정수 78를 반환합니다. 즉, 디스크가 78 % 찼습니다.


3
$ df | tail +2 | sed s/%//g | awk '{ if($5 > 90) print "Alert "$0;}'
  • df | tail +2 처음 두 줄을 건너 뛴 후 모든 출력을 가져옵니다.
  • sed s/%//g 퍼센트 부호 제거
  • awk ... 출력의 5 번째 필드가 90보다 큰 숫자 인 경우 "경고 ..."를 인쇄합니다.

1
Stack Exchange에 오신 것을 환영합니다! 우리는 설명과 맥락을 제공하는 긴 답변을 찾고 있습니다. 한 줄만 대답하지 마십시오. 작동 방식을 설명하십시오. 설명이 포함되지 않은 답변은 제거 될 수 있습니다.
G-Man, 'Reinstate

0

여기 내 변형이 있습니다.

#!/bin/bash

ADMIN=yermail@yerdom.com
ALERT=90
df -H | grep -vE 'abc:/xyz/pqr | tmpfs |cdrom|Used' | awk '{ print $5 " " $1 }' | while read output; do 
usep=$(echo $output | awk '{ print $1}' | cut -d'%' -f1 ) 
echo $usep
partition=$(echo $output | awk '{ print $2 }' ) 
if [ $usep -ge $ALERT ]; then 
  echo  "Alert: Almost out of disk space $usep" 
  df -H | mail -s "Alert: out of disk space $usep"  $ADMIN
fi 
done

0

위의 Gilles 답변에 대해서는 언급 할 수 없지만 awk는 두 번째 부분에서 문자열 기반 비교를 수행한다는 점에 유의하십시오.

$5 >= ALERT

한 자리 임계 값을 테스트 할 때이 사실을 알았습니다. +0을 사용하여 캐스트를 강제로 int로 만들 수 있으므로 비교는 다음과 같습니다.

$5+0 >= ALERT
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.