在Java开发领域,我们经常需要将编译好的Java应用程序打包成Jar文件,以便于部署和运行。
特别是在Linux服务器上,管理多个Jar包的启动和停止是日常运维中的重要一环。
本文介绍如何在Linux环境下高效地启动和管理Jar包,同时提供简洁明了的代码示例,帮助大家更好地理解这一过程。
一、Jar包存放与启动脚本准备
首先,我们需要在Linux系统上设定一个统一的Jar包存放路径,
例如/opt/services/providers。
在这个目录下,我们将放置所有需要运行的Jar包以及一个名为service.sh的启动脚本。
这个脚本将帮助我们实现Jar包的快速启动、停止以及批量管理。
# 在/opt/services/providers目录下创建service.sh脚本
touch /opt/services/providers/service.sh
chmod +x /opt/services/providers/service.sh
二、service.sh脚本配置详解
接下来,我们将详细讲解service.sh脚本的配置过程。
这个脚本将包含Jar包的别名、名称、具体Jar文件以及存放路径等关键信息。
1. 环境变量设置
在脚本的开头,我们首先设置一些必要的环境变量,包括程序代码数组(别名)、程序名称数组、Jar包数组、Jar包路径数组以及项目目录等。
#!/bin/bash# 程序代码数组(别名)
APPS=(channelweb channelcorp channeldemand channelresume channeluser omsweb omscode omscorp omsdemand omsuser omszull oss publicweb search)# 程序名称数组(具体名称)
NAMES=(YL-B-Channel-WEB YL-B-Channel-Corp-Provider YL-B-Channel-Demand-Provider YL-B-Channel-Resume-Provider YL-B-Channel-User-Provider YL-B-BOS-WEB YL-B-Code-Provider YL-B-Corp-Provider YL-B-Demand-Provider YL-B-User-Provider YL-B-Zull YL-B-OSS-Provider YL-B-Public-WEB YL-B-Search-Provider)# Jar包数组
JARS=(YL-B-Channel-WEB.jar YL-B-Channel-Corp-Provider.jar YL-B-Channel-Demand-Provider.jar YL-B-Channel-Resume-Provider.jar YL-B-Channel-User-Provider.jar YL-B-BOS-WEB.jar YL-B-Code-Provider.jar YL-B-Corp-Provider.jar YL-B-Demand-Provider.jar YL-B-User-Provider.jar YL-B-Zull.jar YL-B-OSS-Provider.jar YL-B-Public-WEB.jar YL-B-Search-Provider.jar)# Jar包路径数组(注意这里的路径应该是相对于/opt/services/providers的子目录)
PATHS=(BM-B-Channel-WEB BM-B-Channel-Corp-Provider BM-B-Channel-Demand-Provider BM-B-Channel-Resume-Provider BM-B-Channel-User-Provider BM-B-BOS-WEB BM-B-Code-Provider BM-B-Corp-Provider BM-B-Demand-Provider BM-B-User-Provider BM-B-Zull BM-B-OSS BM-B-Public-WEB BM-B-Search-Provider)
2. 启动函数实现
接下来,我们实现启动函数start()。
这个函数将遍历所有的 Jar 包,并根据传入的参数(如特定别名或 all )来决定启动哪些 Jar 包。
start() {echo"---------------------------开始启动服务..."for ((i=0; i<${#APPS[@]}; i++))doappname="${APPS[$i]}"name="${NAMES[$i]}"classname="${JARS[$i]}"projectdir="/opt/services/providers/${PATHS[$i]}"path_log="/opt/logs/$name"if [ "$2" = "all" ] || [ "$2" = "$appname" ]; thencd$projectdirnohup java -jar \-XX:MetaspaceSize=256m \-XX:MaxMetaspaceSize=256m \-Xms512m \-Xmx512m \-Xmn256m \-Xss256k \-XX:SurvivorRatio=8 \-XX:+UseConcMarkSweepGC \$classname \>> $projectdir/nohup.out 2>&1 &# 等待Jar包启动并获取PIDPID=$(ps -ef | grep $(echo$classname | awk -F/ '{print $NF}') | grep -v grep | awk '{print $2}')cnt=0while [ -z "$PID" ] && [ $cnt -lt 30 ]dosleep 1scnt=$((cnt+1))PID=$(ps -ef | grep $(echo$classname | awk -F/ '{print $NF}') | grep -v grep | awk '{print $2}')doneif [ ! -z "$PID" ]; thenecho"$appname---$name:已经成功启动, PID=$PID"elseecho"$appname---$name:在$cnt秒内未启动,请检查!"fifidoneecho"---------------------------本次启动完成"
}
在这个函数中,我们使用了nohup命令来在后台运行Jar包,并将日志输出到指定的nohup.out文件中。
同时,我们还通过循环和ps命令来等待Jar包启动并获取其进程ID(PID)。
3. 停止函数实现
类似地,我们可以实现停止函数stop()。
这个函数将遍历所有的Jar包,并根据传入的参数来决定停止哪些Jar包。
stop() {echo"---------------------------开始停止服务..."for ((i=0; i<${#APPS[@]}; i++))doappname="${APPS[$i]}"name="${NAMES[$i]}"classname="${JARS[$i]}"projectdir="/opt/services/providers/${PATHS[$i]}"if [ "$2" = "all" ] || [ "$2" = "$appname" ]; thenPID=$(ps -ef | grep $(echo$classname | awk -F/ '{print $NF}') | grep -v grep | awk '{print $2}')if [ ! -z "$PID" ]; thenkill$PIDecho"$name:成功结束, PID=$PID"elseecho"$name:未运行"fifidoneecho"---------------------------本次停止完成"
}
在这个函数中,我们通过ps命令来获取Jar包的PID,并使用kill命令来停止它。
三、使用示例
现在,我们已经配置好了 service.sh
脚本。
接下来,我们可以通过以下命令来启动和停止 Jar 包 。
# 启动名为channeldemand的Jar包
./service.sh start channeldemand# 启动所有Jar包
./service.sh start all# 停止名为channeldemand的Jar包
./service.sh stop channeldemand# 停止所有Jar包
./service.sh stop all
同时,我们还可以通过tail -fn 200 nohup.out
命令来查看特定Jar包的启动日志,以便于排查问题。
四、总结
通过本文的介绍,我们了解了如何在Linux环境下高效地启动和管理Java项目的Jar包。
我们使用了service.sh脚本来实现Jar包的批量启动和停止,并通过详细的代码示例和讲解来帮助大家更好地理解这一过程。
原创 马媛 程序语言