오랫만에 포스팅이 오라클이 아닌 웹로직이라니.. 부끄럽다..
금일 모사이트에서 웹로직 관련 요청사항이 들어왔다
특정 시간대에 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 수정도 불가하고 불가피하게 수시로 내렸다 올려가며 운영을 해야한다면
위 스크립트를 참조하여 매시간, 매분 확인 후 다시 기동시킬수 있도록 조치하자
'Technical posts > Weblogic' 카테고리의 다른 글
웹로직을 웹서버 없이 방화벽으로 로드발란싱할때 설정 (F5 with weblogic) (0) | 2019.12.19 |
---|---|
weblogic 12c MOXy problem / 웹로직 11g에서 12c로 업그레이드 문제 (0) | 2019.09.29 |
Java VisualVM으로 remote 모니터링하기 (0) | 2014.09.22 |
WAS 에서 DB로 접속 불가 java.sql.SQLRecoverableException: IO Error: Connection reset (9) | 2014.09.22 |
Weblogic_Admin_boot.properties 암호 복호화 하기 (0) | 2014.09.22 |