Linux 中使用脚本启动 Java 服务

Linux 中使用脚本启动 Java 服务

Shell 脚本(优化)

主要除去了不必要的指令,同时使用 dirname、realpath 指令来设置关键变量

#!/bin/sh

# 服务启动参数
JAVA_OPTS="-Xmx2g -Xms2g -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./"
# 服务输出的控制台日志的文件名
LOG_FILE="console.log"
# 目标 Java 服务端口号
JAR_PORT=""

set_pid(){
	pid=`netstat -anp|grep ${JAR_PORT}|awk '{printf $7}'|cut -d/ -f1`
	# 清除获取出来的字符存在“-”。如“------123456”
	pid=${pid//-/}
}

# 检查程序是否处于运行状态
is_exist() {
	set_pid
	if [ -z "${pid}" ]; then
		return 0
	else
		echo "pid is ${pid}";
		return 1
	fi
}

kill_service(){
	echo "About to kill service..."
	if [ -z "${pid}" ]; then
		echo "service is not running!"
	else
		echo "pid is ${pid[i]}";
		echo "pid = $pid begin kill -9 $pid"
		kill -9 $pid
		sleep 2
		echo "service process stopped!" 
	fi
	echo "" 
}

# 服务停止方法
stop() {
	set_pid
	kill_service
}

# 服务启动方法
start() {
	echo "Begin start service..."
	is_exist
	if [ $? -eq "1" ]; then
		echo "service is already running. pid is ${pid}"
	else
		echo "JAVA_OPTS: $JAVA_OPTS"
		echo "LOG_FILE: $LOG_FILE"
		echo "spring.profiles.active: $ENV"

		if [ -z "${JAR_NAME}" ]; then
			echo "JAR_NAME is blank"
		else
			nohup java -jar $JAR_NAME --spring.profiles.active=$ENV $JAVA_OPTS>$LOG_FILE_URI/$LOG_FILE 2>&1 &
			tail -800f $LOG_FILE_URI/$LOG_FILE
			echo "complate!"
		fi
	fi
}

# Jar 包处理器。主要获取 Jar 包和包的服务类型
jar_name_handler(){
	echo "Begin resolve jar name..."
	JAR_NAME=$1;
	echo "JAR_NAME: $JAR_NAME"
	
	LOG_FILE_URI=$(dirname $JAR_NAME)
	echo "LOG_FILE_URI: $LOG_FILE_URI"
	
	path=$(realpath $JAR_NAME)
	dir_array=(${path//// })
	app_name=${dir_array[${#dir_array[@]}-1]}
	echo "app name is $app_name"
	
	service_type=${dir_array[1]}
	echo "service_type: $service_type"
	
	location=${dir_array[2]}
	echo "location is $location"
	
	case "$service_type" in
	"admin")
		case "$location" in
		"test")
			JAR_PORT="5699"
			;;
		"gz")
			JAR_PORT="8888"
			;;
		"fs")
			JAR_PORT="8888"
			;;
		"rd")
			JAR_PORT="6060"
			;;
		*)
			echo "jar url is illegal characters"
			exit 0
		esac
		;;
	"pda")
		case "$location" in
		"test")
			JAR_PORT="5424"
			;;
		"gz")
			JAR_PORT="5443"
			;;
		"fs")
			JAR_PORT="5443"
			;;
		"rd")
			JAR_PORT="6061"
			;;
		*)
			echo "jar url is illegal characters"
			exit 0
		esac
		;;
	*)
		echo "app name is illegal characters"
		exit 0
	esac	
	echo "JAR_PORT is $JAR_PORT"
	
	case "$location" in
	"test")
		ENV="test";
		;;
	"gz")
		ENV="prod-gz";
		;;
	"fs")
		ENV="prod-fs";
		;;
	"rd")
		ENV="prod-rd";
		;;
	*)
		echo "app name is illegal characters"
		exit 0
	esac
	echo "ENV is $ENV"
	
	echo 'Jar info resolved!'
	echo "" 
}

while getopts ":e:s:" optname
do
	case "$optname" in
		"s")
			jar_name_handler $OPTARG
			;;
	esac
done

echo "Service update coming soon..."
stop
start

exit 0

Shell 脚本

#!/bin/sh

# 服务启动参数
#JAVA_OPTS="-Xms512m -Xmx512m -XX:MetaspaceSize=512m -XX:MaxMetaspaceSize=1024m -XX:ParallelGCThreads=4 -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=utf-8"
JAVA_OPTS="-Xmx2g -Xms2g -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./"
# 服务输出的控制台日志的文件名
LOG_FILE="console.log"
# 所有类型服务的端口号
ALL_PORT=('8081' '5423' '5699' '5424' '8888' '5443' '6060' '6061')
# 目标 Java 服务端口号
JAR_PORT=""
# 指令事件
EXECUTE_EVENT=""

set_pid(){
	pid=`netstat -anp|grep ${JAR_PORT}|awk '{printf $7}'|cut -d/ -f1`
}

# 检查程序是否处于运行状态
is_exist() {
	# pid=`ps -aux|grep ${JAR_NAME}|grep -v grep|grep -v vi|grep -v dbx|grep -v tail|grep -v start|grep -v stop|sed -n 1p|awk '{print $2}'`
	set_pid
	if [ -z "${pid}" ]; then
		return 0
	else
		echo "pid is ${pid}";
		return 1
	fi
}

# 服务运行状态查看方法
status() {
  is_exist
  if [ $? -eq "1" ]; then
    echo "serivce is running,pid is ${pid}"
  else
    echo "serivce is not running!"
  fi
}

kill_service(){
	echo "About to kill service..."
	if [ -z "${pid}" ]; then
		echo "service is not running!"
	else
		echo "pid is ${pid[i]}";
		echo "pid = $pid begin kill -9 $pid"
		kill -9 $pid
		sleep 2
		echo "service process stopped!" 
	fi
	echo "" 
}

# 服务停止方法
stop() {
	# pid=`netstat -anp|grep ${JAR_PORT}|awk '{printf $7}'|cut -d/ -f1`
	set_pid
	kill_service
}

# 服务启动方法
start() {
	echo "Begin start service..."
	is_exist
	if [ $? -eq "1" ]; then
		echo "service is already running. pid is ${pid}"
	else
		echo "JAVA_OPTS: $JAVA_OPTS"
		echo "LOG_FILE: $LOG_FILE"
		echo "spring.profiles.active: $env"

		if [ -z "${JAR_NAME}" ]; then
			echo "JAR_NAME is blank"
		else
			nohup java -jar $JAR_NAME --spring.profiles.active=$env $JAVA_OPTS>/home/$SERVICE_TYPE/$ENV_FILE/$LOG_FILE 2>&1 &
			tail -800f /home/$SERVICE_TYPE/$ENV_FILE/$LOG_FILE
		fi
	fi
}

# Jar 包处理器。主要获取 Jar 包和包的服务类型
jar_name_handler(){
	echo "Begin resolve jar name..."
	JAR_NAME=$1;
	echo "JAR_NAME is $JAR_NAME"
	
	jar_name_array=(${JAR_NAME//// })
	app_name=${jar_name_array[${#jar_name_array[@]}-1]}
	echo "app_name is $app_name"
	app_name_array=(${app_name//_/ })
	app=${app_name_array[0]}
	echo "app is $app"
	case "$app" in
		"PC")
			SERVICE_TYPE="admin"
			;;
		"PDA")
			SERVICE_TYPE="pda"
			;;
		*)
			echo "app name is illegal characters"
			exit 0
	esac
	
	JAR_PORT=${app_name_array[1]}
	echo "JAR_PORT is $JAR_PORT"
	echo 'Jar name resolved!'
	echo "" 
}

# 设置当前包的端口号。主要用户杀死进程时通过端口号获取 PID
set_jar_port(){
	if [ "$1" != null ];then
		if [[ "${ALL_PORT[@]}"  =~ "${1}" ]]; then
			JAR_PORT=$1
		else
			echo "port $1 is illegal characters"
			exit 0
		fi
	else
		echo "kill action need a port param"
		exit 0
	fi
}

# 设置包的环境
set_env_file(){
	env=$1;
	case "$env" in
		"dev")
			ENV_FILE="dev";
			;;
		"test")
			ENV_FILE="test";
			;;
		"prod-gz")
			ENV_FILE="prod-gz";
			;;
		"prod-fs")
			ENV_FILE="prod-fs";
			;;
		"prod-rd")
			ENV_FILE="prod-rd";
			;;
		*)
			echo "env is illegal characters"
			exit 0
	esac
}

while getopts ":d:k:e:s:" optname
do
	case "$optname" in
		"d")
			jar_name_handler $OPTARG
			EXECUTE_EVENT="start"
			;;
		"k")
			set_jar_port $OPTARG
			EXECUTE_EVENT="stop"
			;;
		"e")
			set_env_file $OPTARG
			;;
		"s")
			jar_name_handler $OPTARG
			EXECUTE_EVENT="update"
			;;
	esac
done

case "$EXECUTE_EVENT" in
	"start")
		if [ -z "${env}" ]; then
			echo "env is blank"
		else
			echo "About to start..."
			start
		fi
		;;
	"stop")
		echo "About to stop..."
		stop
		;;
	"update")
		echo "Service update coming soon..."
		stop
		start
		;;
esac

exit 0

更多:https://cloud.tencent.com/developer/article/1780384

将脚本设置为全局快捷命令

  1. 执行

    sudo vim /etc/bashrc
    

    有些解决方式是进入 /etx/profile 中进行修改,但是实测后发现不行,暂不清楚是否由其他因素干扰

  2. 在文件最后编辑。

    # 格式:alias [别名]='sh [脚本路径]/[脚本名]'
    alias chain='sh /home/bin/chain.sh'
    
  3. 刷新配置文件

    source /etc/bashrc
    
  4. 查看是否已经加入

    alias [别名]
    或
    alias
    

遇到的问题

posted @   紅豆DuoLaameng  阅读(1213)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示