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
将脚本设置为全局快捷命令
-
执行
sudo vim /etc/bashrc
有些解决方式是进入 /etx/profile 中进行修改,但是实测后发现不行,暂不清楚是否由其他因素干扰
-
在文件最后编辑。
# 格式:alias [别名]='sh [脚本路径]/[脚本名]' alias chain='sh /home/bin/chain.sh'
-
刷新配置文件
source /etc/bashrc
-
查看是否已经加入
alias [别名] 或 alias
遇到的问题
-
运行脚本出现:
chain.sh: line 1: $'\r': command not found
解决:执行如下指令
sed -i 's/\r//' one-more.sh
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?