layout: post
title: "crontab -e 로 java를 실행하기"
date: 2010-12-28 09:15:00 +0900
comments: true

2010년 crontab 으로 java를 실행시키기라는 글을 올린 적이 있습니다.
10년이 지났지만, 참 유용하게 사용합니다.

사람의 기억력은 미화하거나, 잊혀지지만,
잘 정리된 글은 필요할 때, 다시 봐도 항상 그 자리에서 저를 도와줍니다.

스프링부트의 임베디드 톰캣이 활성화(?)되기 전에,
모든 자바 어플리케이션은 tomcat을 별도 구성하고,
별도의 tomcat 폴더의 bin 에 있는 catalina.sh 을 실행하여야했습니다.

순수 설정을 정의하고자할 때, CATALINA_OPTS 같은 변수를 export 해야만 했습니다.
예를 들어, jconsole 등을 사용하기 위해 xmxremote 등을 설정해야했고,
scouter 를 하기 위해서는 javaagent 등의 독자적인 설정을 각 sh 파일에 export 해야했습니다.

요근래 스프링부트로 단독으로 올리게 되어,
아예 start 와 stop shell 을 구성하게 되었습니다.

#!/bin/sh or #!/bin/bash

SCOUTER_BASE=/home/xxx/scouter
export XXX_OPTS="-Duser.timezone=Asia/Seoul -javaagent:$SCOUTER_BASE/scouter.agent.jar -verbosegc -server -Xms1g -Xmx1g -Duser.timezone=GMT+09:00 -Dscouter.config=./scouter.conf"

scouter 로 트래픽 및 성능 및 모니터링을 해야하므로,
기본 설정값으로 setEnv.sh 을 구성하였고,
각각의 start, stop 의 쉘을 구성하였습니다.

#!/bin/sh

PID="$(ps -ef|grep java | grep -i xxx | grep -i 8082  | grep -v grep | awk '{print $2}')"
if [[ "" !=  "$PID" ]]; then
  echo "killing $PID"
  kill -s TERM $PID
fi

특정 ‘xxx’ 의 해당 port가 떠있으면 kill 한 후,

#!/bin/bash
usage=`ps -ef | grep java | grep toDsp | grep '8082' | wc -l`
echo $usage

DEFAULT_BASE=/home/xxx/data
. $DEFAULT_BASE/setEnv.sh

if [ $usage -lt 1 ];  then
        echo "ssp to Dsp  재 실행!";
        nohup java -jar -server -XX:+PrintGCDetails $XXX_OPTS -Xloggc:/home/xxx/log/gc/xxxx/gc8082.log -Dspring.profiles.active=prod -Dserver.port=8082 ../xxx-0.0.1-SNAPSHOT.jar 1>/dev/null 2>&1 &

else
        echo "ssp to Dsp 실행 중!";
fi

해당 서비스의 실행하도록 구축하였습니다.
gc 를 모니터링하기 위해 PrintGCDetails, loggc 를 정의하였는데,
조금더 깔끔한 부분이 있는 지 고민해봐야할 거 같습니다.