Technical posts/Weblogic

Weblogic 프로세스 확인 RUNNING이 아니면 강제종료

ODB 2015. 10. 22. 00:16

오랫만에 포스팅이 오라클이 아닌 웹로직이라니.. 부끄럽다..



금일 모사이트에서 웹로직 관련 요청사항이 들어왔다

특정 시간대에 process를 검사하여 RUNNING상태가 아닌 UNKNOWN이나 STARTING 등 정상작동하지 않는 상태인 웹로직 프로세스를 강제 종료하는 쉘을 짜달라고


왜?

어플리케이션에서 OOME가 발생하는데 해당 오류를 당장 수정할 수 없으니 차선책으로 RUNNING이 아닌경우 죽이고 다시시작 하도록 쉘을 짜달란다

웹로직 엔지니어에게 부탁할만한 일이 아닌데;;; 스크립트를 짜면서 상당히 부끄러웠다 이렇게까지 해야하나 라는 생각에


아무튼 까라면 까도록 하자


뼈대가 되는 process 상태체크하는 쉘부터 짜자


#!/bin/ksh

#both server name and server port has to be matched

server_name=("base_domain_M1" "base_domain_M2")

server_port=("7003" "7005")

array=${#server_name[@]}

i=0

pid=""

status=""


while [ $i -lt $array ]

do

pid="`ps -ef | grep ${server_name[i]} |grep -v grep| wc -l`"

status="`java -cp /weblogic/wlserver_10.3/server/lib/weblogic.jar weblogic.Admin -username weblogic -password weblogic1 -url t3://oracle:${server_port[i]} getstate |grep RUNNING |wc -l`"

if [ "$pid" -eq "1" ] then

if [ "$status" -eq "0" ] then

echo "${server_name[i]} Process is running but status is not RUNNING"

else

echo "${server_name[i]} Process is running and the status also RUNNING"

fi

else

echo "${server_name[i]} Process is not running"

fi

i=`expr $i + 1`

done


복잡하다..


코드를 추잡하게 짜서 그렇지 잘돌아가긴 한다


server_name을 array로 모든서버의 이름을 저장하고

server_port를 array로 위의 서버와 맞는 port를 server_name과 순서가 동일하게 작성한다


그러면 while문이 2가 되기 전까지 도는데

먼저 프로세스가 떠 있는지 확인하고

WLST를 이용해서 getstate로 서버의 상태를 확인한다


스크립트를 돌려보면?


[weblogic@oracle ~]$ sh c.sh

base_domain_M1 Process is running and the status also RUNNING

base_domain_M2 Process is running and the status also RUNNING 


지금까지는 상태확인만 가능하다


그러면 간단히 몇가지를 추가해서 완성시키도록 하자


#!/bin/ksh

#both server name and server port has to be matched

server_name=("base_domain_M1" "base_domain_M2")

server_port=("7003" "7005")

script_name=("M1" "M2")

array=${#server_name[@]}

i=0


start () {

echo "starting the process"

sh /weblogic/user_projects/domains/base_domain/start"${script_name[i]}".sh notail

echo "started"

}


while [ $i -lt $array ]

do

pid=""

pid2=""

pid="`ps -ef | grep ${server_name[i]} |grep -v grep| wc -l`"

pid2="`java -cp /weblogic/wlserver_10.3/server/lib/weblogic.jar weblogic.Admin -username weblogic -password weblogic1 -url t3://oracle:${server_port[i]} getstate |grep RUNNING |wc -l`"

if [ "$pid" -eq "1" ]

then

if [ "$pid2" -eq "0" ]

then

echo "${server_name[i]} Process is running but status is not RUNNING"

echo "`ps -ef | grep "${server_name[i]}" |grep -v grep`"

kill -9 `pgrep -f base_domain_${script_name[i]}`

echo "above process is killed"

sleep 1

start

else

echo "${server_name[i]} Process is running and the status also RUNNING"

fi

else

echo "${server_name[i]} Process is not running"

start

fi

i=`expr $i + 1`

done



빨간색이 추가된 부분으로


1. script_name을 시작 스크립트명을 명시하게 위해 추가


2. process가 not running일때, process가 running이지만 weblogic server의 status가 RUNNING이 아닐때 해당 메니지드서버를 구동시킨다

   두 경우에 start문이 반복되어 들어가야 하므로 function을 만들어 불필요하게 길어지는것을 막도록 한다


웹로직 시작시 start 스크립트에는 tail -f 가 기본으로 들어가 있어

startM1.sh 스크립트 하단에 조건을 추가하였다


if [ "$1" != "notail" ]

then

tail -f $LOG_DIR/$LOG_NAME.log

fi 

첫번째 argument가 notail이 아니면 tail -f를 해라

말을 바꾸면

첫번째 argument가 notail이면 tail -f를 하지마라



확인을 위해

둘중 한서버를 ADMIN상태로 만들고 돌려보자


[weblogic@oracle ~]$ sh c.sh

base_domain_M1 Process is running but status is not RUNNING

weblogic 27821 27772 17 00:00 pts/9    00:00:04 /usr/bin/java16/bin/java -client -D:base_domain_M1 -Xms256m -Xmx512m -XX:MaxPermSize=128m -Dweblogic.Name=M1 -Djava.security.policy=/weblogic/wlserver_10.3/server/lib/weblogic.policy -Dweblogic.security.SSL.trustedCAKeyStore=/weblogic/wlserver_10.3/server/lib/cacerts -Xverify:none -da -Dplatform.home=/weblogic/wlserver_10.3 -Dwls.home=/weblogic/wlserver_10.3/server -Dweblogic.home=/weblogic/wlserver_10.3/server -Dweblogic.management.discover=false -Dweblogic.management.server=t3://oracle:7001 -Dwlw.iterativeDev=false -Dwlw.testConsole=false -Dwlw.logErrorsToConsole=false -Dweblogic.ext.dirs=/weblogic/patch_wls1036/profiles/default/sysext_manifest_classpath -Dweblogic.system.BootIdentityFile=/weblogic/user_projects/domains/base_domain/boot.properties weblogic.Server

above process is killed

starting the process

nohup: redirecting stderr to stdout

DONE!

started

base_domain_M2 Process is running and the status also RUNNING 


base_domain에 M1이라는 서버의 process는 running이었으나 status가 RUNNING이 아니라 해당 process를 pgrep으로 잡아 kill하고 다시시작 시킴

base_domain에 M2서버는 process도 status로 둘다 running으로 별도의 작업은 안함


[weblogic@oracle ~]$ sh c.sh

base_domain_M1 Process is running and the status also RUNNING

base_domain_M2 Process is running and the status also RUNNING 


이후 위와 같이 정상적으로 RUNNING인것을 확인하였다


weblogic에 올라가는 application을 잘만들고 최적화 시켜서

안죽게 만드는것이 중요하지만 application 수정도 불가하고 불가피하게 수시로 내렸다 올려가며 운영을 해야한다면

위 스크립트를 참조하여 매시간, 매분 확인 후 다시 기동시킬수 있도록 조치하자




"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."