JBoss EAP 6 Standalone 모드의 운영 효율성을 높이기 위해, JVM 옵션과 환경 변수를 별도의 설정 파일(Config Shell)로 분리하고 이를 로드하여 서버를 제어(Start/Stop/Status)하는 커스텀 쉘 스크립트 작성법을 공유합니다.
Test Environment
- OS: CentOS 7.2
- Middleware: JBoss EAP 6.4
1. 스크립트 구조 및 전략
유지보수성과 확장성을 위해 스크립트를 두 개의 파일로 분리합니다.
- Config Script (config1.sh): JVM 옵션, 경로, IP, 포트 등 변수 정의.
- Control Script (jboss_ctl.sh): Config를 로드하여 실제 프로세스를 제어하는 로직.
2. 설정 스크립트 (config1.sh)
서버 인스턴스별 고유한 설정을 이곳에 정의합니다. JAVA_OPTS를 통해 메모리 및 GC 로그 설정을 상세하게 튜닝할 수 있습니다.
#!/bin/sh
DATE=`date +%Y%m%d%H%M%S`
##### 1. Basic Configuration #####
export JBOSS_HOME=/SW/was/JBoss
export SERVER_HOME=/SW/was/JBoss/TEST/TESTServer11
export LOG_PATH=/app/logs/was
export NODE_NAME=TESTServer11
export CONFIG_FILE=standalone-ha.xml
# Network & Port Offset
export SERVER_IP=10.252.16.25
export PORT_OFFSET=750
export MGMT_ADDR=$SERVER_IP
# Controller Port Calculation (Base 9999 + Offset)
let CONTROLLER_PORT=9999+$PORT_OFFSET
export CONTROLLER_PORT
# Admin User (Shutdown용)
export USER=admin
##### 2. JVM Options (Memory & GC) #####
# Heap Memory
export JAVA_OPTS="-server -Xms1024m -Xmx2048m -XX:MaxPermSize=256m"
# GC Logging
export JAVA_OPTS=" $JAVA_OPTS -verbose:gc -XX:+PrintGCTimeStamps -XX:+PrintGCDetails "
export JAVA_OPTS=" $JAVA_OPTS -Xloggc:$LOG_PATH/log/gclog/gc_$DATE.log "
# GC Algorithm (ParallelGC)
export JAVA_OPTS=" $JAVA_OPTS -XX:+UseParallelGC -XX:+ExplicitGCInvokesConcurrent"
# Heap Dump on OOM
export JAVA_OPTS=" $JAVA_OPTS -XX:-HeapDumpOnOutOfMemoryError "
export JAVA_OPTS=" $JAVA_OPTS -XX:HeapDumpPath=$LOG_PATH/heap/$NODE_NAME "
##### 3. System Properties (-D options) #####
export JAVA_OPTS=" $JAVA_OPTS -Djava.net.preferIPv4Stack=true"
export JAVA_OPTS=" $JAVA_OPTS -Dorg.jboss.resolver.warning=true"
export JAVA_OPTS=" $JAVA_OPTS -Djava.awt.headless=true"
export JAVA_OPTS=" $JAVA_OPTS -DjvmRoute=$NODE_NAME"
# JBoss Path & Binding
export JAVA_OPTS=" $JAVA_OPTS -Djboss.server.base.dir=$SERVER_HOME"
export JAVA_OPTS=" $JAVA_OPTS -Djboss.server.log.dir=$LOG_PATH/$NODE_NAME"
export JAVA_OPTS=" $JAVA_OPTS -Djboss.socket.binding.port-offset=$PORT_OFFSET"
export JAVA_OPTS=" $JAVA_OPTS -Djboss.node.name=$NODE_NAME"
export JAVA_OPTS=" $JAVA_OPTS -Djboss.bind.address.management=$MGMT_ADDR"
export JAVA_OPTS=" $JAVA_OPTS -Djboss.bind.address=$SERVER_IP"
# Clustering (Multicast)
export JAVA_OPTS=" $JAVA_OPTS -Djboss.default.jgroups.stack=tcp"
# export JAVA_OPTS=" $JAVA_OPTS -Djboss.default.multicast.address=230.1.0.1"
echo "Configuration Loaded: $NODE_NAME"
3. 제어 스크립트 (jboss_ctl.sh)
실제 기동 및 정지를 담당하는 메인 스크립트입니다. ./config/config1.sh를 로드하여 변수들을 가져옵니다.
#!/bin/sh
# Config 파일 로드 (경로 주의)
. ./config/config1.sh
start(){
# 프로세스 중복 실행 방지
PID=`ps -ef | grep java | grep "jboss.node.name=$NODE_NAME " | awk '{print $2}'`
if [ "x$PID" != "x" ]; then
echo "###############################################"
echo "ERROR: JBoss SERVER ($NODE_NAME) is already RUNNING (PID=$PID)"
echo "###############################################"
exit 1
fi
echo "#######################"
echo " Starting JBoss EAP "
echo "#######################"
# nohup으로 백그라운드 실행, 로그 리다이렉션
nohup $JBOSS_HOME/bin/standalone.sh --server-config=$CONFIG_FILE >> $LOG_PATH/console.log 2>&1 &
echo "Starting... Wait for checking status..."
sleep 5
status
}
stop(){
echo "#######################"
echo " Stopping JBoss "
echo "#######################"
# 보안을 위해 패스워드는 입력받도록 처리 (자동화 시 변수로 대체 가능)
echo -n "Enter Controller Password: "
read -s PASSWORD
echo ""
# CLI를 이용한 안전한 종료 (Graceful Shutdown)
$JBOSS_HOME/bin/jboss-cli.sh --connect --controller=$SERVER_IP:$CONTROLLER_PORT --command=:shutdown --user=$USER --password=$PASSWORD
}
status() {
# 포트 리슨 상태로 구동 여부 확인
_up=`netstat -an | grep $CONTROLLER_PORT | grep LISTEN | wc -l`
if [ "$_up" -ne 0 ]; then
PID=`ps -ef | grep java | grep "jboss.node.name=$NODE_NAME " | awk '{print $2}'`
echo "###############################################"
echo " JBoss Server is RUNNING !! "
echo " Node: $NODE_NAME (PID: $PID)"
echo " Port: $CONTROLLER_PORT (Management)"
echo "###############################################"
else
echo "##################################"
echo " JBoss Server is STOPPED !! "
echo " Node: $NODE_NAME "
echo "##################################"
fi
}
# 파라미터 처리
case "$1" in
start)
start
;;
stop)
stop
;;
status)
status
;;
restart)
stop
sleep 5
start
;;
*)
echo "Usage: $0 {start|stop|status|restart}"
exit 1
esac
exit 0
4. 사용 방법 및 주의사항
사용법
# 실행 권한 부여
chmod +x jboss_ctl.sh
# 기동
./jboss_ctl.sh start
# 상태 확인
./jboss_ctl.sh status
# 정지 (패스워드 입력 필요)
./jboss_ctl.sh stop
Tip:
config1.sh 파일 내의 PORT_OFFSET 변수를 활용하면, 하나의 물리 서버에서 포트 충돌 없이 여러 개의 인스턴스를 띄울 수 있습니다. (예: 0, 100, 200...)