windows 通过 bat 脚本后台启动 jar 包,通过 jps 找到 pid,然后停止指定 jar 包,附 linux shell 脚本启停脚本

16 篇文章 2 订阅
1 篇文章 0 订阅

后台运行的原因

在 windows 上,在 cmd 命令窗口,使用 java -jar 的方式启动,cmd 窗口会一直存在,若关闭,程序也就停止运行了,所以需要后台运行

说明

windows 通过 bat 脚本后台启动 jar 包,通过 jps 找到 pid,然后停止指定 jar 包,附 linux shell 脚本启停脚本

参考

springboot 程序,lib 下是依赖 jar
在这里插入图片描述

windows 端启停脚本

1. 启动脚本
bat 启动无法输出日志到文件,但是拷贝命令到 cmd 就可以输出到文件,不懂为什么
若启动多个 jar 包,须保证 jar 包名称不同。

@echo off
echo find analog-access-1.0.jar to kill before start process.
call stop.bat
echo ------ begin start analog-access-1.0.jar, see: ./logs/analog-access.log. ------
start javaw -Xms1024m -Xmx2048m  -Dsun.lang.ClassLoader.allowArraySyntax=true -Duser.timezone=GMT+08 -cp analog-access-1.0.jar;lib/*; indi.tudan.analogaccess.AnalogAccessApplication 1>>.\logs\analog-access.log 2>&1 &
exit

2. 停止脚本
解析:通过 jps -l 命令,找到程序对应的进程 id,即 pid,然后终止 pid 即可。其中,indi.tudan.analogaccess.AnalogAccessApplication 为程序入口类包路径。

@echo off
set program=indi.tudan.analogaccess.AnalogAccessApplication
echo program: %program%
for /f "usebackq tokens=1-2" %%a in (`jps -l ^| findstr %program%`) do (
	set pid=%%a
	set image_name=%%b
)
if not defined pid (echo process %program% does not exists) else (
	echo prepare to kill %image_name%
	echo start kill %pid% ...
	rem 根据进程ID,kill进程
	taskkill /f /pid %pid%
)

linux 端启停脚本

1. 启动脚本

echo "find analog-access-1.0.jar to kill before start process."
sh stop.sh
echo "------ begin start analog-access-1.0.jar, see: ./logs/analog-access.log. ------"

lib_names=`ls -l ./lib | awk '{if($NF~/jar/) print $NF}'`
import_libs=""
for lib_name in $lib_names
do
  import_libs=$import_libs":./lib/"$lib_name
done

nohup java -Xms1024m -Xmx2048m  -Dsun.lang.ClassLoader.allowArraySyntax=true -Duser.timezone=GMT+08 -cp "./analog-access-1.0.jar$import_libs" indi.tudan.analogaccess.AnalogAccessApplication > ./logs/analog-access.log 2>&1 &

2. 停止脚本

#!/bin/sh
PROCESS=`ps auxww | grep 'analog-access-1.0.jar' | grep 'indi.tudan.analogaccess.AnalogAccessApplication' | grep -v grep`
if [ "$PROCESS" = "" ]; then
  echo "process analog-access-1.0.jar not exists"
else
  SID=`echo $PROCESS | awk '{print $2 }'`
  echo "prepare to kill "$PROCESS
  echo "begin kill "$SID" ..."
  kill -9 $SID
  echo "kill successfully"
fi;

jvm.dll、java.exe、javaw.exe

  1. jvm.dll
    jvm.dll 是一个 java 虚拟机在 windows 平台环境上的实现,也是 JRE 的一部分,一个 C 程序能够使用 jvm.dll 直接运行在 jvm 上。

  2. java.exe
    java.exe 是 win32 控制台应用,它提供了一种帮助,代替使用 jvm.dll 执行 java classes 文件,作为一个 win32 控制台应用,显然他是和一个控制台相关联,当执行 java classes 的时候,它运行。

  3. javaw.exe
    javaw.exe 是相似的和 java.exe 是一个 win32 的 GUI 应用,应用提供自己的 GUI 窗口,不启用控制台。

区别

  1. java 运行 jar 以后,会阻塞在那里直到窗口关闭。
  2. javaw 运行 jar 后,不会阻塞,直接就可以进行下一条命令的运行了。

jps

jps 的英文名称是 JVM Process Status Tool, 功能和 ps 命令类似。可以列出正在运行的虚拟机进程、显示虚拟机执行主类(main () 函数所在的类)的名称、这些进程的本地虚拟机的唯一 ID(LVMID, Local Virtual Machine Identifier,LVMID 和 PID 是一致的)。

选项作用
-q只输出 LVMID (PID)
-m输出虚拟机进程启动时传递给主类 main () 函数的参数
-l输出主类的全名,如果进程执行时是 Jar 包,输出 Jar 路径
-v输出虚拟机进程启动时 JVM 参数
### 回答1: Spring Boot 是一个用于开发Java应用的框架,可以方便快捷地构建独立的、生产级别的应用程序。在Windows上,我们可以编写一个启动停止Spring Boot应用的脚本。 首先,我们需要创建一个批处理文件(后缀名为.bat),用于启动Spring Boot应用。在批处理文件中,我们需要执行Java命令来启动应用程序。例如,我们可以使用以下命令启动Spring Boot应用: ``` @echo off title 启动Spring Boot应用 set JAR_FILE=path/to/your/application.jar java -jar %JAR_FILE% ``` 在上面的示例中,我们首先指定启动脚本的标题,在命令提示符中会显示该标题。然后,我们设置了一个变量`JAR_FILE`,指定了Spring Boot应用的jar文件的路径。最后,我们使用`java -jar`命令来启动应用。 然后,我们可以创建一个停止脚本停止Spring Boot应用。停止脚本需要使用Spring Boot Actuator的shutdown端点来停止应用程序。以下是一个示例停止脚本: ``` @echo off title 停止Spring Boot应用 set SHUTDOWN_URL=http://localhost:8080/actuator/shutdown powershell -Command Invoke-WebRequest -Uri %SHUTDOWN_URL% -Method POST ``` 在上面的示例中,我们首先指定停止脚本的标题。然后,我们设置了一个变量`SHUTDOWN_URL`,指定了Spring Boot应用的Shutdown端点的URL路径。最后,我们使用PowerShell命令`Invoke-WebRequest`来向该URL发送一个POST请求,从而停止应用程序。 通过上述的启动停止脚本,我们就可以方便地启动停止Spring Boot应用了。当我们需要启动应用时,只需执行启动脚本即可;当我们需要停止应用时,只需执行停止脚本即可。这样,我们就能更好地管理和控制Spring Boot应用的运行。 ### 回答2: Windows Spring Boot 启停脚本可以使用以下步骤: 1. 打开文本编辑器,创建一个新的批处理文件(.bat)。 2. 在批处理文件中,首先添加设置 Java 环境变量的命令,例如: `set JAVA_HOME=C:\Program Files\Java\jdk1.8.0_291` 3. 接下来,使用 `cd` 命令切换到 Spring Boot 项目的目录,例如: `cd C:\path\to\spring-boot-project` 4. 添加启动 Spring Boot 应用程序的命令,例如: `start java -jar YourSpringBootApplication.jar` 5. 如果你的应用程序需要使用其他配置文件或环境变量,你可以使用 `-D` 参数进行指定,例如: `start java -jar YourSpringBootApplication.jar -Dspring.config.location=classpath:/custom.properties` 6. 添加停止 Spring Boot 应用程序的命令,例如: `taskkill /f /im java.exe` 7. 保存批处理文件并退出文本编辑器。 现在,你可以双击运行这个批处理文件来启动停止你的 Spring Boot 应用程序。另外,你还可以将这个批处理文件添加到 Windows 任务计划程序中,以便在系统启动时自动启动 Spring Boot 应用程序。 需要注意的是,这个启停脚本假设你已经正确地设置了 Java 环境变量,并拥有正确的路径和文件名来启动停止 Spring Boot 应用程序。请根据你自己的环境和应用程序的要求进行相应的修改。 ### 回答3: Windows Spring Boot启停脚本用于控制Spring Boot应用程序的启动停止。以下是一个简单的示例脚本: @echo off SET JAVA_HOME=C:\Program Files\Java\jdk1.8.0_291 SET PATH=%JAVA_HOME%\bin;%PATH% SET JAR_NAME=my-spring-boot-app.jar SET APP_NAME=MySpringBootApplication :start echo Starting %APP_NAME%... java -jar %JAR_NAME% :stop echo Stopping %APP_NAME%... for /f "tokens=5" %%a in ('jcmd ^| find "%JAR_NAME%"') do ( jcmd %%a JVM.mgmt_shutdown ) ping localhost -n 5 > nul SET /A COUNTER+=1 if %COUNTER% LSS 5 ( goto stop ) echo %APP_NAME% did not stop gracefully. Terminating forcefully... for /f "tokens=5" %%a in ('jcmd ^| find "%JAR_NAME%"') do ( jcmd %%a VM.system_exit 0 ) echo %APP_NAME% stopped. 这个脚本中的%JAVA_HOME%变量应根据Java安装的实际路径进行修改。%JAR_NAME%变量是Spring Boot应用程序的JAR文件名,%APP_NAME%是应用程序的名称。 脚本中的:start标签用于启动应用程序。它使用java -jar命令来启动Spring Boot应用程序。 :stop标签用于停止应用程序。它使用jcmd命令来查找正在运行的Java进程,并使用JVM.mgmt_shutdown命令向应用程序发送关闭信号。如果应用程序没有正常关闭,脚本将尝试关闭它五次。 在每次尝试关闭后,脚本会使用ping命令暂停5秒钟。如果应用程序在尝试次数达到五次之前未能正常关闭,脚本将使用VM.system_exit命令强制终止它。 以上是一个简单的Windows Spring Boot启停脚本示例,可以根据具体的需求进行修改和扩展。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值