Linux使用脚本启动jar/war包(springboot+maven工程jar包)

这篇具有很好参考价值的文章主要介绍了Linux使用脚本启动jar/war包(springboot+maven工程jar包)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Linux(CentOS7)使用脚本启动java jar/war包


本文以jar包为例(war包是同样的操作流程)。


开始之前,先准备一个jar包

以springboot工程为例。

我打包用的maven。

在pom文件中可以约束最终的jar包名称:
linux运行war,Java,linux,脚本,linux,jar,spring boot
mvn clear 再然后 mvn install 这些都没什么好说的。


建议以下文件全部放在一个目录下

1、部署jar包

通过xftp或别的方式,将jar包放入服务器某个目录
linux运行war,Java,linux,脚本,linux,jar,spring boot

2、准备application.yml(springboot工程,如果是别的框架请略过此节)

yml文件放入jar包的同一个目录,内容是常规的springboot-yml文件内容,注意yml格式:
linux运行war,Java,linux,脚本,linux,jar,spring boot

一会儿启动的时候会以服务器这个yml文件配置的内容为准👆👆👆
而不是项目中的yml文件👇👇👇

linux运行war,Java,linux,脚本,linux,jar,spring boot

3、准备jvm_opt文件(.file文件)

linux运行war,Java,linux,脚本,linux,jar,spring boot

此文件内容为java虚拟机启动时的参数:
linux运行war,Java,linux,脚本,linux,jar,spring boot

配置jvm内存:一般只改abc这三个地方:
a = b 并且 c = a*(2/3)
单位:g 或者 m
如果你怕这么配置有啥问题,你可以临时恶补一下java虚拟机的知识,反正我这儿好几个工具jar包这么配没啥问题。

VM_OPTIONS="-Xms512m -Xmx512m -Xss256K -Xmn384m -XX:+UseG1GC -XX:G1HeapRegionSize=16m -XX:G1ReservePercent=25 -XX:InitiatingHeapOccupancyPercent=30 -XX:-OmitStackTraceInFastThrow -XX:+AlwaysPreTouch -XX:-UseLargePages -XX:-UseBiasedLocking"

-Xss根据你的接口或者定时任务的每次调度的数据大小,可以适当增大一些。

4、准备脚本

我这儿命名为boot.sh

先上脚本,文章后面会介绍:怎么用?脚本内容的含义?

#!/bin/bash
APP_NAME=$1
YUM_FILE_PATH=$2

[ -r jvm_opt ] && source jvm_opt   ##检查配置文件存在且可读,则将其souce
VM_OPT=${VM_OPTIONS:-Xms1g -Xmx1g -Xss256K -Xmn600m -XX:+UseG1GC -XX:G1HeapRegionSize=16m -XX:G1ReservePercent=25 -XX:InitiatingHeapOccupancyPercent=30 -XX:-OmitStackTraceInFastThrow -XX:+AlwaysPreTouch -XX:-UseLargePages -XX:-UseBiasedLocking}

# 提示输入参数
usage() {
    echo app_name=$APP_NAME vm_opt=$VM_OPT yum=$YUM_FILE_PATH
    echo "Usage: ./boot.sh [APP_NAME] [YML_NAME] [start|stop|restart|status]"
    exit 1
}

# 检查程序是否在运行
is_exist(){
    # 获取PID
    PID=$(ps -ef |grep ${APP_NAME} | grep -v $0 |grep -v grep |awk '{print $2}')
    # -z "${pid}"判断pid是否存在,如果不存在返回1,存在返回0
    if [[ -z "${PID}" ]]; then
        # 如果进程不存在返回1
	echo "进程不存在"
        return 1
    else
        # 进程存在返回0
	echo "进程存在"
        return 0
    fi
}

# 启动方法
start(){
    is_exist
    if [[ $? -eq "0" ]]; then
        echo "${APP_NAME} is already running, PID=${pid}"
    else
        nohup java -jar $VM_OPT -Dspring.config.location=$YUM_FILE_PATH $APP_NAME >log 2>&1 &
		PID=$(echo $!)
        echo "${APP_NAME} start success, PID=$! YUM_FILE_PATH=${YUM_FILE_PATH}"
    fi
}

# 停止方法
stop(){
    is_exist
    if [[ $? -eq "0" ]]; then
        kill -9 ${PID}
        echo "${APP_NAME} process stop, PID=${PID}"
    else
        echo "There is not the process of ${APP_NAME}"
    fi
}

# 重启进程函数
restart(){
    stop
	echo "${APP_NAME} 准备重启..."
	sleep 5
    start
}

# 查看进程状态
status(){
    is_exist
    if [[ $? -eq "0" ]]; then
        echo "${APP_NAME} is running, PID=${PID}"
    else
        echo "There is not the process of ${APP_NAME}"
    fi
}

case $3 in
"start")
        start
        ;;
"stop")
        stop
        ;;
"restart")
        restart
        ;;
"status")
       status
        ;;
	*)
	usage
	;;
esac
exit 0

使用脚本

1、先来到你这几个文件的目录

cd /opt/tools/es-tasks

2、给脚本boot.sh赋予可执行权限:

 chmod 777 boot.sh

777是什么意思?

linux中权限是用二进制表示的。

先看一个控制台的例子:
linux运行war,Java,linux,脚本,linux,jar,spring boot
看看这一列,第一个位置的 - 或者 d 这种文件描述符咱们先不用看,先从第二个位置的r开始看:
一共有9个位置 rwxrwxrwx 共三组 rwx,分别对应了 三个角色(拥有者、群组、其他人) 对这个文件或文件目录的权限。
“r - -” 就是只有【读】权限,对应二进制的 100
“- w -” 就是只有【写】权限,对应二进制的 010
“- -x” 就是只有【执行】权限,对应二进制的 001
分别翻译成十进制,“r - -” 就是400,"- w -“就是020,”- - x"就是001
那么:

如果是"rw-“就是有【读、写】权限,没有【执行】权限,对应的就是420
如果是"r-x"就是有【读、执行】权限,没有【写】权限,就是401
如果是”-wx"就是有【写、执行】权限,没有【读】权限,对应的就是021(这种设计一般不存在,都能改能执行了,就不能读吗),这里只是说明权限逻辑举例需要。

所以 “rwx” 就是421,而4+2+1=7(777就是从这来的),那么 “chmod 777 file” 这个指令的含义就是:将此文件的【读、写、执行】权限赋予给【拥有者、群组、其他人】这些角色。
当然:
1、如果你只想将此文件的【读、写、执行】权限赋予给【自己】或【自己的群组】,只需要 “chmod 700 file” 或者 “chmod 770 file” 就行。
2、 如果你只想将此文件的【读、写】权限赋予给自己或自己的群组,只需要"chmod 600 file"或者"chmod 660 file"就行了。
3、如果你想让【自己和自己组】拥有【读、写、执行】权限,而【其他人】只能【读】,只需要"chmod 774 file"。

所谓 linux权限,就这么简单。至于用户和用户组,也很简单,阁下可自行查阅其他资料学习,我就不赘述了。

请跟随我回到主题(这篇文章讲啥来着?看看标题,咱们继续)

3、执行命令

启动

./boot.sh xxx.jar application.yml start

停止

./boot.sh xxx.jar application.yml stop

重启

./boot.sh xxx.jar application.yml restart

查看是否在运行

./boot.sh xxx.jar application.yml status

脚本说明(老鸟可以略过这一节)

1、第一句

#!/bin/bash

写在 .sh 脚本文件最开头第一行。
这个是必须要写的,linux系统不同的话,写法上可能会有一丢丢区别,我这里是CentOS7。

2、第二句

APP_NAME=$1
YUM_FILE_PATH=$2

声明了两个变量,指向 $1 和 $2。
$1 对应的是咱们启动命令的:

./boot.sh xxx.jar application.yml start/stop/restart/status

其中的xxx.jar这一部分。
bash解释器是按照空格进行命令的切割,而 xxx.jar 在第【1】位置,所以是$1 (第【0】位置是 ./boot)。
$2同理。
这两句话的意思就是,声明这俩变量,并且让APP_NAME=xxx.jar,让YUM_FILE_PATH=application.yml

3、第三句和第四句

[ -r jvm_opt ] && source jvm_opt

检查这个jvm_opt文件,如果存在并且可读,就把它的内容加载进来。

VM_OPT=${VM_OPTIONS:-Xms1g -Xmx1g -Xss256K -Xmn600m -XX:+UseG1GC -XX:G1HeapRegionSize=16m -XX:G1ReservePercent=25 -XX:InitiatingHeapOccupancyPercent=30 -XX:-OmitStackTraceInFastThrow -XX:+AlwaysPreTouch -XX:-UseLargePages -XX:-UseBiasedLocking}

声明一个VM_OPT变量,让它等于后面这个${VM_OPTIONS : …},这里面的VM_OPTIONS就是从jvm_opt文件中取出来的变量。
意思是:如果取到了,就让VM_OPT=VM_OPTIONS,如果没取到,就让VM_OPT等于冒号后面的这一长串值。

4、接下来就是六个自定义方法(也叫函数)

第一个方法,用于提示
usage() {
    echo app_name=$APP_NAME vm_opt=$VM_OPT yum=$YUM_FILE_PATH
    echo "Usage: ./boot.sh [APP_NAME] [YML_NAME] [start|stop|restart|status]"
    exit 1
}

此方法在脚本被非正常执行时触发,比如说你./boot.sh start就想执行,xxx.jar也不写
那它就提示你 “Usage: ./boot.sh [APP_NAME] [YML_NAME] [start|stop|restart|status]” 一个正常命令格式是什么。

第二个方法,用于判断是否已经在运行
is_exist(){
    # 获取PID
    PID=$(ps -ef |grep ${APP_NAME} | grep -v $0 |grep -v grep |awk '{print $2}')
    # -z "${pid}"判断pid是否存在,如果不存在返回1,存在返回0
    if [[ -z "${PID}" ]]; then
        # 如果进程不存在返回1
        echo "进程不存在"
        return 1
    else
        # 进程存在返回0
        echo "进程存在"
        return 0
    fi
}
第三个方法,用于启动jar包
start(){
    is_exist
    if [[ $? -eq "0" ]]; then
        echo "${APP_NAME} is already running, PID=${pid}"
    else
        nohup java -jar $VM_OPT -Dspring.config.location=$YUM_FILE_PATH $APP_NAME >log 2>&1 &
                PID=$(echo $!)
        echo "${APP_NAME} start success, PID=$! YUM_FILE_PATH=${YUM_FILE_PATH}"
    fi
}

其中,"is_exist"是调用了上面讲的第二个方法。
然后拿着 is_exist() 方法运行的结果(0或者1)来决定要不要启动。
这一段脚本总体意思也很简单,判断进程是否已经存在,如果存在就提示;不存在就静默启动,启动完了提示success。

其中:

nohup java -jar $VM_OPT -Dspring.config.location=$YUM_FILE_PATH $APP_NAME >log 2>&1 &

这一段就是在启动了。 “>” 代表输出,log代表同级目录下的日志文件log.file,如果启动后log文件不存在则会自动创建。
">log"意思是把程序的输出内容写到log这个文件中去。

顺便提一嘴奥

一个 > 号 “>”
会把之前的覆盖掉,也就是说,每次重启jar包,之前log中的内容就没了。
好处也很明显,不会造成文件膨胀,排查本次启动后问题时也会很方便。

两个 > 号 “>>”
在之前的文件内容的基础上,不断追加新的内容。

我springboot工程一般都用到日志框架,这些框架会把日志,按日期写入某个文件夹内的一个个文件中去,所以我一般脚本这个位置写 一个">“符号,也就是”>log"

继续看这段脚本:

nohup java -jar $VM_OPT -Dspring.config.location=$YUM_FILE_PATH $APP_NAME >log 2>&1 &

“2>&1” 意思是 把程序的 标准错误输出 也重定向到 标准输出。

在linux中,标准输入用0表示,标准输出用1表示,标准错误输出用2表示。

最后一个 “&” 代表静默启动,“别占用我控制台一直打印” 就这个意思。

第四个方法,用于停止jar包
stop(){
    is_exist
    if [[ $? -eq "0" ]]; then
        kill -9 ${PID}
        echo "${APP_NAME} process stop, PID=${PID}"
    else
        echo "There is not the process of ${APP_NAME}"
    fi
}

非常好理解:进程存在否?存在就杀掉进程然后提示;不存在就直接提示。

第五个方法,用于重启jar包
restart(){
    stop
        echo "${APP_NAME} 准备重启..."
        sleep 5
    start
}

也很好理解:先停止,睡5秒,再启动。

第六个方法,查看运行状态
status(){
    is_exist
    if [[ $? -eq "0" ]]; then
        echo "${APP_NAME} is running, PID=${PID}"
    else
        echo "There is not the process of ${APP_NAME}"
    fi
}

这个就不用说了,只是调用了一下 is_exist() 方法然后根据0或1的返回,给我们提示运行状态而已。

脚本的最后一段

case $3 in
"start")
        start
        ;;
"stop")
        stop
        ;;
"restart")
        restart
        ;;
"status")
       status
        ;;
        *)
        usage
        ;;
esac
exit 0

前面讲过,$3就是咱们启动命令:

./boot.sh xxx.jar application start/stop/restart/status

其中的 start / stop / restart / status 这个部分。

脚本根据我们输入的其中一个选项,执行不同的方法。

" *)usage ;; " 的意思是我们输入的东西不在【start / stop / restart / status】这个范围内,就会走 usage() 方法,也就是提示我们正常的格式。

“esac” 就是 “case” 反过来写,是脚本中的一种语法,类似于【 " if " 与 " fi "】。

“exit 0” 意思是运行正常退出脚本程序。

jar包运行后的log日志怎么看?

我一般用这几个命令

1、实时查看100行日志

tail -100f log

2、搜索日志中内容

more log

然后敲 “/”
再然后输入你要搜索的内容,回车。
如果输入错了,按 ctrl + backspace(退格) 往前删。

写在最后

简单好用,相当于一个雏形,支持高度diy。
但是要小心,别在脚本中写自己拿不准的指令。

diy举例

比如说你就想用springboot工程resources下的那个yml配置,不愿意把它提取出来,脚本改起来也很简单,只要找到 $, 把 $ 后面的数字改成你命令中对应的位置就ok。
比如:

vi boot.sh

先删掉 YUM_FILE_PATH=$2 这个变量(所有引用到这个变量的地方也给改改好奥)
把脚本最后的

case $3 in …

其中的$3

改成你 start/stop/restart/status 这个指令的位置

假如说你指令是这么写的:

./boot.sh xxx.jar start

那就把./boot.sh脚本中的所有 $3 改成 $2。
很明显嘛,你变短了,数字也就变少了。

话说回来,稍微有点规模的项目一般也用不着这玩意,docker、k8s集群部署会更省心。
就有时候一些工具类的小玩意用一下还是蛮不错的。


ok,完活!文章来源地址https://www.toymoban.com/news/detail-700888.html

到了这里,关于Linux使用脚本启动jar/war包(springboot+maven工程jar包)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SpringBoot项目(jar)部署,启动脚本

    SpringBoot项目(jar)部署,需要先关闭原来启动的项目,再启动新的项目。直接输入命令,费时费力,还容易出错。所以,使用脚本启动。 脚本名: start.sh 此脚本需要放置在jar包的同级目录,才能正确找到jar包。 在脚本所在目录,执行如下命令: 一开始,我在给pid赋值时,

    2024年02月10日
    浏览(32)
  • 【Jenkins】使用java -jar jenkins.war --httpPort=XXXX启动Jenkins报错【解决方案】

    👉欢迎关注博主【米码收割机】 👉一起学习C++、Python主流编程语言。 👉机器人、人工智能等相关领域开发技术。 👉主流开发、测试技能。 在cmd中,执行启动命令行: 报错信息如下: 5月 06, 2023 4:55:49 下午 Main verifyJavaVersion 严重: Running with Java class version 63 which is not in th

    2024年02月07日
    浏览(36)
  • Maven的三种项目打包方式——pom,jar,war的区别

    记录一次项目启动失败,发现Could not resolve dependencies for project的错误,原因是我的子模块的打包方式是pom 是怎么发现,因为我是从父模块打包的,但是发现我这个子模块找不到,我发现父子模块依赖关系也没错啊,我就单独打包这个子模块,结果没有错误,但是没生成targe

    2024年02月12日
    浏览(32)
  • Linux  jar包自启动脚本(亲测有效)

    在Linux服务器上设置开机启动jar包,服务器重启时就会自动运行项目,实现半自动化,实现思路如下。 方法一: 1、在jar包同级目录下创建执行脚本 2、自启动脚本文件保存后退出(按Esc键  :wq),文件授权 3、修改/etc/rc.d/rc.local 4、重启测试 5、待服务器重启后通过命令查看

    2024年02月21日
    浏览(20)
  • SpringBoot 插件 spring-boot-maven-plugin 原理,以及SpringBoo工程部署的 jar 包瘦身实战

    我们直接使用 maven package (maven自带的package打包功能),打包Jar包的时候,不会将该项目所依赖的Jar包一起打进去,在使用 java -jar 命令启动项目时会报错,项目无法正常启动。这个时候,我们就可以考虑引用 spring-boot-maven-plugin 插件来为项目打Jar包。 maven项目的pom.xml中,添

    2024年02月06日
    浏览(32)
  • springboot项目打包jar和war有什么区别

    Spring Boot 项目可以打包成可执行的 JAR(Java Archive) 文件或 WAR(Web Archive) 文件,两者之间有一些区别: JAR 文件是一种常见的Java归档文件格式,它包含了项目的所有代码、依赖项和资源文件。 Spring Boot 的JAR包是可执行的,可以通过 java -jar 命令直接运行。这种方式下,Spr

    2024年01月25日
    浏览(36)
  • SpringBoot项目的两种发布方式(jar包和war包)

    1.1、在pom.xml中添加一个SpringBoot的构建的插件 1.2、在maven视图中,双击“package”,在target中会产生xxx.jar包 1.3、将生成的jar包复制到任意文件夹中,通过java -jar 命令运行该jar包 浏览器访问结果如下: 2.1、在pom.xml文件中将jar修改为war 2.2、设置tomcat启动器依赖范围 2.3、设置war包

    2024年01月17日
    浏览(43)
  • Linux 部署Java项目-jar包和war包(五)

    部署之前先说下两种包,java项目部署到服务器一般有用war包的,也有用jar包的,微服务spring-cloud普及后大部分打包都是jar,部署之前先搞清楚自己要打war包还是jar包,下面小介绍两种包的区别: spring boot既可以打成war发布,也可以打成jar包发布。说一下区别: jar包: 直接通

    2024年02月04日
    浏览(32)
  • SpringBoot学习——项目用maven打包成jar包 & windows + Linux平台运行 & Linux安装java & 遇到的问题

    1.maven打包springboot项目,jar包; 2.windows安装java环境,以及运行jar包; 3.Linux安装java环境,以及运行jar包; 4.运行jar包template might not exist报错及解决; Maven 构建生命周期定义了一个项目构建跟发布的过程。 一个典型的 Maven 构建(build)生命周期是由以下几个阶段的序列组成的

    2024年02月16日
    浏览(50)
  • SpringBoot打包成WAR包的时候把第三方jar包打到LIB文件夹下和把第三方jar包打入到SpringBoot jar包中

    转载 首先我们应该知道我们把 SPRINGBOOT 项目打包成WAR包和JAR包的时候分别需要何种插件 我们最常用的把 springBoot 打成jar包的插件是下面这样的一个插件,这是把我们的 springBoot 项目打包成为一个可执行 jar 的插件 把 springBoot 项目打包成一个war包的插件是下面这样的一个插件

    2024年02月07日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包