jar包如何运行原理Jar包程序部署后如何启动和停止java -jar启动的jar包怎么停




jar包如何运行原理Jar包程序部署后如何启动和停止java -jar启动的jar包怎么停

2022-07-21 2:25:29 网络知识 官方管理员

现在JavaWeb开发一般都是用Springboot框架,部署应用时使用Jar包(JavaARchive),也就是Java归档文件,而不是使用War包(打包格式的Javaweb工程)。

jar包如何运行原理(Jar包程序部署后如何启动和停止)(1)

War包结构

Jar包和War包的主要区别就在于Jar包内部已经集成了Tomcat服务器,War包部署还需要先安装一个Tomcat服务。用jar部署java服务更加方便,也是大势所趋。在Linux服务器上部署完Jar包程序以后,该如何启动服务和停止服务呢?

Jar包的启动

在主机上先配置好Java的环境变量,之后就可以用java命令启动Jar包:

java-jarxxx.jar

在启动jar包的时候,通常需要设置很多与内存有关的参数,要详细了解Java启动内存参数,可以阅读前文《Java面试常见问题:JVM内存异常及内存参数设置》。常用的内存配置参数包括:

  • -XX:MetapaceSize设置元空间大小的初始值;
  • -XX:MaxMetaspaceSize设置元空间大小的最大值;
  • -Xms设置堆内存的初始值;
  • -Xmx设置堆内存的最大值;
  • -Xmn设置新生代的大小;
  • -Xss设置栈区的大小;
  • -XX:SurvivorRatio设置新生代中Eden区域和Survivor区域的比例,默认为8
  • -XX:+UseConcMarkSweepGC设置垃圾回收器为并发标记清除(ConcurrentMarkSweep)垃圾回收器。

这样在Jar包的启动命令中要把所有参数都配置好,可要写不少字。

java-jar-XX:MetaspaceSize=128m-XX:MaxMetaspaceSize=128m-Xms1024m-Xmx1024m-Xmn256m-Xss256k-XX:SurvivorRatio=8-XX:+UseConcMarkSweepGCxxxService.jar

为了避免每次启动都打这么多字,我们可以把这一长串启动命令放在Shell脚本中运行。要启动Jar包服务只需要运行脚本就行。

Jar包启动脚本

Shell是一个用C语言编写的程序,它是用户使用Linux/Unix系统的桥梁,有好多种不同版本的Shell。KenThompson开发的shShell是第一个UnixShell。

jar包如何运行原理(Jar包程序部署后如何启动和停止)(2)

美国计算机科学学者KennethLaneThompson,1983年图灵奖得主,C语言前身B语言的作者,Unix发明人之一

在Linux上,最常用的Shell程序就是bash。bash保持了对shShell的兼容性,是各种Linux发行版默认配置的shell。下面我们就看一下如何用shell脚本实现Jar包启动。

#!/bin/shAPPDIR=`pwd`PIDFILE=$APPDIR/xxxService.pidif[-f"$PIDFILE"]&&kill-0$(cat"$PIDFILE");thenecho"xxxServiceisalreadyrunning..."exit1finohupjava-jar-XX:MetaspaceSize=128m-XX:MaxMetaspaceSize=128m-Xms1024m-Xmx1024m-Xmn256m-Xss256k-XX:SurvivorRatio=8-XX:+UseConcMarkSweepGCxxxService.jar>out.file2>&1&echo$!>$PIDFILEecho"startxxxServicesuccess..."

第一行脚本是说明shell程序所在的位置,基本上Linux系统都是一样的。

第二行脚本是用pwd指令获取当前路径。通常我们把这个shell脚本和Jar包文件会放在一个路径下,要特别注意pwd上面的不是单引号,而是键盘左上角的“点号”。APPDIR就是脚本所在的当前路径了。

第三行脚本定义了变量PIDFILE,指向文件名xxxService.pid,这个文件就是用来记录Jar包启动后的进程ID。这样将来就可以用进程ID来关闭Jar包服务了。

第四行脚本是判断是否xxxService程序已经运行了。

  • [-f"$PIDFILE"]是查询pid文件是否存在。
  • cat"$PIDFILE"是打印pid文件内容,也就是进程ID。
  • kill-0pid的意思并不是要杀死进程,而是让系统来对进程进行检查,如果进程不存在,kill-0会报错。

第5行到第7行脚本的含义:如果pid文件存在且对应进程也存在,那么说明Jar包已经启动了,不需要再重新启动,脚本退出运行。

如果Jar包尚未启动,则运行第8行脚本。省略掉Java启动内存设置参数,就是下面这样:

nohupjava-jarxxxService.jar>out.file2>&1&echo$!>$PIDFILE

  • nohup意思是不挂断运行命令,当账户退出或终端关闭时,程序仍然运行。
  • >outfile代表输出重定向,程序运行时的标准输出内容都会打印到out.file上。
  • 2>&1就是将标准错误重定向到标准输出。标准输出已经到了out.file上,因此错误也会输出到这个文件上面。如果不希望记录标准输出和错误,可以重定向到/dev/null上,因为/dev/null是一个不存在的设备,从这里什么也读不出来。
  • &代表在后台运行,echo$!>$PIDFILE则是把进程ID输出到pid文件上。

第8行脚本执行成功后,第9行脚本打印成功。另外我们还可以在当前目录下发现多了一个xxxService.pid文件。

Jar包停止运行

那么要如何关掉正在执行的Java进程呢,通常可以运行:

psaux|grepxxxService

这句指令会列出所有带有xxxService字样的进程,在其中我们找到要关掉的进程ID,随后就用kill-9pid可以杀死进程。kill-9发送SIGKILL信号给进程,告诉进程,你被终结了,请立刻退出。

不过有了启动脚本作为基础,我们不需要再费力去找进程ID。结合启动脚本,我们还可以设计下面这样一个停止脚本。

#!/bin/shAPPDIR=`pwd`PIDFILE=$APPDIR/xxxService.pidif[!-f"$PIDFILE"]||!kill-0"$(cat"$PIDFILE")";thenecho"xxxServicenotrunning..."elseecho"stoppingxxxService..."PID="$(cat"$PIDFILE")"kill-9$PIDrm"$PIDFILE"echo"...xxxServicestopped"fi

这个停止脚本和启动脚本类似,这里就不再逐行解释了

发表评论:

最近发表
网站分类
标签列表