[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은 대상서버를 지정하여 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
댓글
댓글 쓰기