쉘 스크립트 모니터링 - swel seukeulibteu moniteoling

안녕하세요
운영중인 시스템의 경우에 모니터링이 중요합니다.

유료솔루션을 구매해서 모니터링을 할 수 도 있고
오픈소스인 nagios (https://www.nagios.org/) 무료버전인 core버전을 설치해서 이용할 수 도 있고

훌륭한 Zabbix(https://www.zabbix.com/)를 무료로 설치해서 모니터링을 할 수 있습니다.

관제시스템을 구축해서 해당 관제시스템에서 모니터링을 수행할 수도 있는데

저같은 경우에는 RPC를 이용한 shell script를 호출하는 방식으로 직접 구현을 하여 사용합니다.

쉘 스크립트 모니터링 - swel seukeulibteu moniteoling

쉘 스크립트를 만들고 나서 별도의 서버에서 원격으로 쉘을 실행하거나
아니면 파이썬등의 스크립트를 통해서도 간단하게 모니터링 데이터를 수집할 수 있습니다.

process, disk io, memory, network traffic, web/was server 등 모두 쉘스크립트로 모니터링 할 수 있습니다.
해당 쉘을 코딩해 놓은 후

외부에서 호출을 하거나 자체 시스템에서 주기적으로 실행해주는 adapter 프로그램을 만들어서 구동하면
가능한데..

제일 중요한것이 안에서 직접 수행하는 쉘스크립트를 어떻게 만드느냐가 어려운것 같습니다. 제 기준에서는요...

그리하여 일부 간단한 쉘 스크립트를 공유하고자 합니다.

#!/bin/sh

UNKNOWN_STATE=3
CRITICAL_STATE=2
WARNING_STATE=1
OK_STATE=0

if [ $# = 0 ]; then
       echo "CRITICAL - Usage: check_ps.sh arg[process name]"
       exit $CRITICAL_STATE
fi

PNAME=$(ps -eo cmd |grep $1 | grep -v grep | grep -v "bin/sh")

if [ -z "$PNAME" ];then
       echo "CRITICAL - $1 of process does not exists"
       exit $CRITICAL_STATE
else
       echo "OK - $1 of process exists"
       exit $OK_STATE
fi

exit $OK_STATE

위 스크립트는 시스템내부 명령어로 프로세스를 체크한 후 정해진 에러레벨을 리턴하는 스크립트 입니다.

중요한것은

PNAME=$(ps -eo cmd |grep $1 | grep -v grep | grep -v "bin/sh")

이 부분이 제일 중요합니다. 전달받은 인자를 갖고 ps명령어로 해당 프로세스를 찾습니다.
그리하여 존재하지 않으면 $CRITICAL_STATE를 리턴하고
존재하면 $OK_STATE를 리턴합니다.

해당 스크립트를 호출하는 프로그램에서 에러 레벨을 체크하고 이메일이나 문자로 전송을 해주게 됩니다.


다음으로는 web/was 서버 모니터링 입니다.
위에서 특정 was와 web서버의 프로세스를 모니터링 하였다 라면
다음으로 was나 web이 정상적인 기능을 하는지 체크합니다.

프로세스가 살아있다고 해서 정상적으로 구동되고 있다라고 판단하면 안됩니다.
해당 was나 web을 호출해 보고 정상적으로 서버기능을 하는지 체크가 필요합니다.

#!/bin/sh

UNKNOWN_STATE=3
CRITICAL_STATE=2
WARNING_STATE=1
OK_STATE=0

STATUS=2
STATUS=`curl $1 --connect-timeout 10 -m 10 | grep 'Service OK' | wc -l`

if [ -z $STATUS ];then
       STATUS=2
fi

if [ "0$STATUS" -ge 1 ];then
echo "OK : WEB SUCCESS"
       exit $OK_STATE
else
echo "CRITICAL : WEB FAIL"
       exit $CRITICAL_STATE
       
fi

STATUS=curl $1 --connect-timeout 10 -m 10 | grep 'Service OK' | wc -l
이 부분이 제일 중요한 부분입니다. curl을 이용해서 특정 url을 호출해 보고 그 결과값에서 'Service OK' 라는 문자가 있는지 체크합니다.

프로세스만 체크하게되면 좀비프로세스인지 정작 web/was가 죽어있는지 체크하기가 어렵습니다.

직접 해당 서버 포트로 호출을 해보고 리턴되는 결과를 가지고 체크를 하여야만 보다 완벽한 모니터링이 되겠습니다.

O&M같은 비싼 솔루션을 돈주가 사지 않아도 최소한 필요한 것은 이렇게 직접 모니터링 스크립트를 통해서 구현할 수 있습니다.

관심있으신 분들은 직접 만들어 보는것도 좋겠습니다.

ETC

모니터링 Shell Script 1433 포트 체크 쉘 스크립트 linux

모니터링 Shell Script 1433 포트 체크 쉘 스크립트 

nagios 와 sms 모듈을 이용한 1433 (MSSQL) 포트 체크 후 다운시 sms 발송하는 스크립트 입니다.

별거 아니지만 살짝 응용한다면 그럭저럭 쓸만 하실듯 합니다.

export LANG=ko_KR.eucKR
export JAVA_HOME=/usr/local/java
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=".:/root/sms/sms.jar"

server[0]="192.168.1.2"
server[1]="192.168.1.3"
server[2]="192.168.1.4"
server[3]="192.168.1.5"
server[4]="192.168.1.6"
server[5]="192.168.1.7"
server[6]="192.168.1.8"
server[7]="192.168.1.9"
server[8]="192.168.1.10"
server[9]="192.168.1.15"
server[10]="192.168.1.50"

for((i=0 ; i<${#server[*]} ; i++)) ; do


/usr/local/nagios/libexec/check_tcp -H ${server[$i]} -p 1433 | awk '{print $1}' > /root/SMS_CAREER/1433_PORT_CHECK/VALUE/${server[$i]}

VALUE=`cat /root/SMS_CAREER/1433_PORT_CHECK/VALUE/${server[$i]}`

if [ $VALUE != "TCP" ] ; then
java sms.Send 01xxxxxxx 01xxxxxxxx ${server[$i]}_1433PORT_DOWN
fi
done

#!/bin/sh

#MEMORY 사용율

MEMORY_TOTAL=`free | grep ^Mem | awk '{print $2}'`

MEMORY_USED=`free | grep ^-/+ | awk '{print $3}'`

MEMORY_PERCENT=$((100*MEMORY_USED/MEMORY_TOTAL))

#CPU 사용율

CPU_PERCENT=`top -b -n 1 | grep -i cpu\(s\)| awk -F'{print $4}| tr -d "%id," | awk '{print 100-$1}'`

#DISK 사용율

DISK_TOTAL=`df -P | grep -v ^Filesystem | awk '{sum += $2END { print sum; }'`

DISK_USED=`df -P | grep -v ^Filesystem | awk '{sum += $3END { print sum; }'`

DISK_PERCENT=$((100*$DISK_USED/$DISK_TOTAL))

echo $MEMORY_PERCENT $CPU_PERCENT $DISK_PERCENT