[Shell Script ] 서버 ping 감시하기

 서버 ping  감시하기 


네트워크의 상태가 이상하지 않은지 또는 서버가 정지했는지 ping 명령어로 감시하고 싶을 때 사용하는 스크립트입니다 . 

#!/bin/sh

# ping 실행 결과 상태, 0이면 성공이므로 1로 초기화 합니다

result=1     #1                                                

#대상 서버가 명령행 인수로 지정되지 않으면 에러 종료
if [ -z "$1" ]; then                     #
    echo "대상 호스트를 입력하세요">&2    #
    exit 1                              #
fi                                      #2

#ping 명령어를 3회 실행, 성공하면 result를 0으로
i=0                                     #3
while [ $i -lt 3 ]
do
    #ping 명령어 실행, 종료 상태만 필요합니다
    #/dev/null 에 리다이렉트
    ping -c 1 "$1">/dev/null            #4

    #ping 명령어 종료 상태 판단하며 result=0 으로 반복문 호출
    #실패하면 3초 대기 후 실행
    if [ $? -eq 0 ]; then               #5
        result=0
        break
    else
        sleep 3
        i=$(expr $i + 1)
    fi
done
#현재 시각을 [yyyy/mm/dd] 형태로 조합
date_str=$(date '+%Y/%m/%d %H:%M:%S')  #6

#ping  결과를 $result 로 판별해서 표시
if [ $result -eq 0 ]; then             #
    echo "[$date_str] Ping OK: $1"     #
else                                   #
    echo "[$date_str] Ping NG : $1"    #
fi                                     #7

이 스크립트는 ping 명령어로 서버가 정상적으로 가동하는지 감시합니다 . 
명령행 인수에 대상 서버 IP 주소 또는 호스트 명을 지정해서 실행하면 대상 서버에 ping결과를 OK/NG 로 표현합니다 .







ping 명령어 옵션 

ping은 대상서버를 지정하여 ICMP 프로토콜을 송신합니다 . 
ping 명령어는 Echo Request 패킷을 송신하여 그 응답으로 Echo Reply가 돌아오는지 통신상태를 확인합니다 . 

 

옵션

설명

-c <count>

count 개의 ICMP 패킷을 송신한 후 정지 

-i <초>

패킷을 보낼 때 마다 지정한 초만큼 기다림. 기본은 1초 

-q

시작과 끝만 메세지 출력 중간 결과는 표시 x



#1 : ping 결과 상태를 저장하는 셀 변수 result 를 정의 하며 성공시 0이 되므로 여기서는 1   로 초기화 합니다 . 

result=1     #1    


#2 : test 명령어 -z 연산자를 이용하여 명령행 인수에 대상 호스트가 지정되었는지 확인합니다 .  $1은 명령행 인수 첫번째 값이 들어있는 특수 변수입니다 . 
-z 는 빈문자 일경우 참이 되므로 #1의 if문이 참이면 인수 지정이 없습니다 .  


if [ -z "$1" ]; then                     #
    echo "대상 호스트를 입력하세요" >&2    #
    exit 1                              #
fi                                      #2


#3 : ping 명령어를 실행하는 while 문 입니다 . 셀 변수 i는 반복 카운터 0으로 초기화 합니다 

i=0                                     #3
while [ $i -lt 3 ]
do

#4 : ping -c 옵션을 이용해 1회만 ping을 실행합니다 . 종료 상태가 셸 특수 변수 $?에 들어 있으므로 if문으로 0인지 판별합니다. 

ping -c 1 "$1">/dev/null        

#5 : 종료 상태가 0이면 ping은 성공이므로 result를 성공으로 지정하고  break로 while 문을 빠져 나옵니다 . 
0이 아니라면 sleep 명령어로 3초간 기다린 후 ping을 반복합니다

 if [ $? -eq 0 ]; then               #5
        result=0
        break
    else
        sleep 3
        i=$(expr $i + 1)
    fi
done

#6 :  date 명령어로 현재시각을 'yyyy/mm/dd hh:mm:ss' 과 같은 형식으로 표시합니다 .

date_str=$(date '+%Y/%m/%d %H:%M:%S')  #6




#7 : ping 명령어 결과를 출력 

if [ $result -eq 0 ]; then             #
    echo "[$date_str] Ping OK: $1"     #
else                                   #
    echo "[$date_str] Ping NG : $1"    #
fi                                     #7

댓글