自学内容网 自学内容网

Windows Server 检测并重启占用端口的Java应用

在开发和部署Java应用程序时,有时我们会遇到应用已在运行且占用特定端口的情况,这会导致无法启动新的实例。此教程将教你如何编写一个批处理脚本,该脚本可以自动检测某个端口是否被占用,如果应用程序已经运行,它将关闭占用该端口的进程并重新启动应用程序。

脚本功能

检测端口是否被占用:通过 netstat 命令检测指定的端口是否被当前的应用占用。
关闭占用进程:如果端口已经被占用,脚本会自动终止占用该端口的进程。
重新启动应用:在关闭旧进程后,脚本会启动新的Java应用实例。
自动化重启:整个流程完全自动化,无需手动干预。

使用说明

  • 设置应用名称与端口:
  • app_name:设置你要启动的应用程序的名称,这里以 app-1.0.0 为例。
  • port:设置应用程序运行时占用的端口号,默认为 82。
  • 添加 Java 路径:如果你的系统中没有将Java路径添加到系统环境变量中,可以通过 set PATH 临时设置你的JDK路径。

脚本逻辑

脚本首先使用 netstat 来检测端口是否已经被占用。如果检测到端口正在监听(即应用程序已经在运行),它会自动执行 taskkill 命令关闭占用该端口的进程。关闭进程后,脚本会等待几秒钟以确保进程完全退出,然后启动新的应用程序。如果端口未被占用,则直接启动应用程序。

@echo off
set app_name=app-1.0.0
set PATH=%PATH%;C:\Program Files\Java\jdk-11.0.17\bin
set port=82

rem Check if the specified port is already in use
for /f "tokens=4,5" %%i in ('netstat -aon ^| findstr %port%') do (
set n=%%i
set pid=%%j
if "LISTENING"=="%%i" (
    goto shutdown
)
)

rem Start the application if the port is not in use
echo "Starting application: %app_name% on port %port%"
start "%app_name%" java -Dfile.encoding=UTF-8 -jar %app_name%.jar --spring.profiles.active=prod
goto end

:shutdown
rem Kill the process if it is using the specified port
if "%n%"=="" (
echo "Application is already stopped"
) else (
    echo "Killing process with PID: %pid% on port %port%"
taskkill /f /pid %pid%

rem Wait for a few seconds to ensure the process has terminated
timeout /t 5 /nobreak >nul
)

rem Start the new application after killing the old process
echo "Restarting application: %app_name% on port %port%"
start "%app_name%" java -Dfile.encoding=UTF-8 -jar %app_name%.jar --spring.profiles.active=prod
exit

:end

步骤解析

  • 检查端口占用:脚本使用 netstat -aon | findstr %port% 检测端口的状态,如果端口处于 LISTENING 状态,则说明应用正在运行。
  • 终止进程:通过 taskkill /f /pid %pid% 杀掉占用端口的进程。%pid% 是通过 netstat 获取的进程ID。
  • 延迟等待:为了确保进程完全退出,脚本使用 timeout /t 5 来等待 5 秒钟,避免进程关闭不彻底的情况。
  • 启动应用:使用 start 命令重新启动应用程序,并指定运行环境参数,例如 --spring.profiles.active=prod。

注意事项

  • 如果你的应用程序占用的端口不是 82,你可以修改 set port=82 这行,将端口号替换为你的应用实际使用的端口号。
  • 如果你的Java环境路径不同,确保修改 set PATH 的值,指向你的JDK路径。

原文地址:https://blog.csdn.net/icjs_cc/article/details/142894518

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!