[ Linux ] Shell脚本启动jar包

本文介绍了如何在Linux环境下通过Shell脚本来启动包含配置文件的jar包应用。首先,确保jar包与脚本在同一目录下。对于简单启动,使用`java -cp`命令指定classpath并启动主类。当需要配置文件时,详细步骤包括进入jar包目录,使用`nohup`命令后台运行,并重定向输出到日志文件。同时,文章还提供了检查服务是否已运行及解决端口占用问题的方法。

案例1:简单的启动方式

注意:jar 包与shell脚本文件必须在同一目录下

在这里插入图片描述

#!/bin/bash

APP_NAME=jsf-demo-boot-provider-service-0.0.1-SNAPSHOT.jar
 

usage() {
echo "Usage: sh demo.sh [start|stop|restart|status]"
exit 1 
}
 

is_exist() {
pid=`ps -ef | grep $APP_NAME | grep -v grep | awk '{print $2}' `

if [ -z "${pid}" ]
then
 return 1
else
 return 0
fi
}
 

start() {
is_exist
if [ $? -eq "0" ]
then
 echo "${APP_NAME} is already running. pid=${pid} ."
else
 nohup java -jar $APP_NAME > /dev/null 2>&1 &
fi
}
 
#停止方法
stop() {
is_exist
if [ $? -eq "0" ]
then
 kill -9 $pid
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
;;
*)
usage
;;
esac

案例2:带配置文件时

将我们打好的文件夹上传到Linux。因为是以dir方式打包的,各个文件夹是分类打包的。
如下图,确认打包后的文件夹没有缺失的以后,开始启动shell脚本。

在这里插入图片描述

Shell脚本

#!/bin/bash
APP_NAME=xx.statistic.service

usage() {
	echo "Usage: sh demo.sh [start|stop|restart|status]"
	exit 1
}

is_exist() {
	pid=`ps -ef | grep $APP_NAME | grep -v grep | awk '{print $2}' `

	if [ -z "$pid" ]
	then
		return 1
	else
		return 0
	fi
}


start() {
	is_exist
	if [ $? -eq "0" ]
	then
		echo "$APP_NAME is already running. pid=$pid ."
	else
		cd ../boot
		nohup java -cp ../conf/:../lib/*   com.xx.xxx.statistic.service.xxxxxxServiceApplication > ../log/soclog.log 2>&1 &
	fi
}


#停止方法
stop() {
	is_exist
	if [ $? -eq "0" ]
	then
		kill -9 $pid
	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
;;
*)
usage
;;
esac

Shell脚本中使用的语句的解释

  1. 以往我们启动jar包都是 java -jar xxx.jar 的方式启动
  2. 这里启动jar包的命令如下

cd …/boot
nohup java -cp …/conf/:…/lib/* com.jd.soc.statistic.service.SocStatisticServiceApplication > …/log/soclog.log 2>&1 &

首先进入到jar包所在的目录

  • -cp

其中-cp命令是将xxx.jar加入到classpath,这样java class loader就会在这里面查找匹配的类。

-cp和-classpath 一样,是指定类运行所依赖其他类的路径,通常是类库,jar包之类,需要全路径到jar包,window上";“分隔,linux上是”:"分隔。

  • 指明主类入口

平时运行jar文件的方法是:java -jar xxx.jar
但是有时,我们希望运行里面的具体某个类,这时可以通过:Java -cp xxx.jar
com.xxx.xxxApplication,它会找到这个类的main函数,开始执行

  • /dev/nul
    首先表示标准输出重定向到空设备文件,也就是不输出任何信息到终端,说白了就是不显示任何信息.
  • 2>&1
    接着,标准错误输出重定向 到 标准输出,因为之前标准输出已经重定向到了空设备文件,所以标准错误输出也重定向到空设备文件。
  • …/log/soclog.log 2>&1
    这里表示标准输出、标准错误输出都输出到 上一级目录 log/soclog.log文件中
  1. 判断服务是否已经正在运行

pid=ps -ef | grep $APP_NAME | grep -v grep | awk '{print $2}'
这里是拿到程序的pid。如果程序已经执行了,pid就是有值的。
ps -ef 会查询当前所有正在运行的进程
grep test 会筛选包含test的所有进程
grep -v grep 反向查找,不会查找包含 grep 的进程
awk {print $2}会打印第二列的值,也就是会返回 匹配到的PID

如下,进入到shell脚本所在的目录,执行脚本程序。
随后进入log目录就看到jar包执行后打印的日志了

在这里插入图片描述

如果遇到端口占用:
netstat -alnp | grep 8085
kill -9 pid

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_popo_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值