Linux java启动脚本
参数
参数 | 类型 | 默认值 | 描述 |
---|---|---|---|
-gc | Boolean | false | 打开GC日志 |
-oom | Boolean | false | 开启Out of memory错误日志 |
-sl | Boolean | false | 输出启动日志到文件 |
-iw | Boolean | false | 开启非法映射警告 |
脚本内容
#!/bin/bash
#===========================================================================================
# configuration
#===========================================================================================
APP_NAME=Project-1.0.0.jar #修改app名称
#JAVA_HOME=/usr/local/jdk-11.0.2 #jdk位置 配了环境变量可以不设置,没有环境变量需要开启,指向jdk路径
LOG_DIR=logs #日志目录
OPEN_GCLOG=false #是否开启gc日志
OPEN_OOM_DUMP=false #是否开启out of memory
OPEN_START_LOG=false #是否开启启动日志
OPEN_ILLEGAL_REFLEX_WARNING=false #是否关闭反射警告
#===========================================================================================
# init val
#===========================================================================================
export JAVA_HOME
BASE_DIR=$(dirname $(readlink -f "$0"))
APP_FULLNAME="${BASE_DIR}/${APP_NAME}"
JAVA="${JAVA_HOME}/bin/java"
JAVA_MAJOR_VERSION=$($JAVA -version 2>&1 | sed -E -n 's/.* version "([0-9]*).*$/\1/p')
JAVA_OPT=
#===========================================================================================
# check jdk
#===========================================================================================
error_exit ()
{
echo "ERROR: $1 !!"
exit 1
}
if [ -z "${JAVA_HOME}" ]; then
error_exit "Please set the JAVA_HOME variable in your environment, We need java(x64)! jdk8 or later is better!"
fi
#===========================================================================================
# init flags
#===========================================================================================
init_flags()
{
for x in "$@"
do
if [ $x = "-gc" ]; then
OPEN_GCLOG=true
fi
if [ $x = "-oom" ]; then
OPEN_OOM_DUMP=true
fi
if [ $x = "-sl" ]; then
OPEN_START_LOG=true
fi
if [ $x = "-iw" ]; then
OPEN_ILLEGAL_REFLEX_WARNING=true
fi
done
}
init_flags $@
#===========================================================================================
# common func
#===========================================================================================
build_java_opt()
{
if $OPEN_GCLOG; then
if [[ "$JAVA_MAJOR_VERSION" -ge "9" ]]; then
JAVA_OPT="${JAVA_OPT} -Xlog:gc*:file=${BASE_DIR}/${LOG_DIR}/gc.log:time:filecount=10:filesize=100m"
else
JAVA_OPT="${JAVA_OPT} -Xloggc:${BASE_DIR}/${LOG_DIR}/gc.log -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=100M"
fi
fi
if $OPEN_ILLEGAL_REFLEX_WARNING; then
if [[ "$JAVA_MAJOR_VERSION" -ge "9" ]]; then
JAVA_OPT="${JAVA_OPT} --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.math=ALL-UNNAMED"
fi
fi
if $OPEN_OOM_DUMP; then
JAVA_OPT="${JAVA_OPT} -XX:-OmitStackTraceInFastThrow -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=${BASE_DIR}/${LOG_DIR}/heapdump.hprof"
fi
JAVA_OPT="${JAVA_OPT} -Dloader.path=.,resources,lib"
JAVA_OPT="${JAVA_OPT} -Djava.library.path=."
}
ensure_log_dir()
{
if [ ! -e ${BASE_DIR}/${LOG_DIR} ]; then
mkdir ${BASE_DIR}/${LOG_DIR}
fi
}
build_java_opt
ensure_log_dir
#===========================================================================================
# Application
#===========================================================================================
#使用说明,用来提示输入参数
help() {
echo "help: sh 执行脚本.sh [start|stop|restart|status]"
echo "-gc:open save gc logs"
echo "-oom:open out of memory"
echo "-sl:open save start log"
echo "-iw:open illegal reflex warning"
exit 1
}
#检查程序是否在运行
is_exist(){
pid=`ps -ef|grep ${APP_FULLNAME}|grep -v grep|awk '{print $2}' `
#如果不存在返回1,存在返回0
if [ -z "${pid}" ]; then
return 1
else
return 0
fi
}
#启动方法
start(){
build_java_opt
ensure_log_dir
is_exist
if [ $? -eq "0" ]; then
echo "${APP_NAME} is already running. pid=${pid} ."
else
if $OPEN_START_LOG; then
nohup "${JAVA}" -jar ${JAVA_OPT} "${BASE_DIR}/${APP_NAME}" > ${BASE_DIR}/${LOG_DIR}/startup.log 2>&1 &
else
nohup "${JAVA}" -jar ${JAVA_OPT} "${BASE_DIR}/${APP_NAME}" > /dev/null 2>&1 &
fi
is_exist
if [ $? -eq "0" ]; then
echo "${APP_NAME} is start success..."
else
echo "${APP_NAME} is start failed..."
fi
fi
}
#停止方法
stop(){
is_exist
if [ $? -eq "0" ]; then
kill -9 $pid
echo "${APP_NAME} is stoped..."
else
echo "${APP_NAME} is not running..."
fi
}
#输出运行状态
status(){
is_exist
if [ $? -eq "0" ]; then
echo "${APP_NAME} is running. Pid is ${pid}..."
else
echo "${APP_NAME} is NOT running..."
fi
}
#重启
restart(){
stop
start
}
#根据输入参数,选择执行对应方法,不输入则执行使用说明
case "$1" in
"start")
start
;;
"stop")
stop
;;
"status")
status
;;
"restart")
restart
;;
*)
help
;;
esac