例如,常见的错误描述:
错误: 代理抛出异常错误: java.rmi.server.ExportException: Port already in use: 1099; nested exception is:
java.net.BindException: Address already in use: JVM_Bind
那么很容易想到解决的办法就是关掉相关进程,于是打开任务管理器,打开资源监视器,找对应的进程号,最后关闭。问题在于有时候占用端口的进程往往不是我们所熟悉的进程,从名字上看不容易找到。所以就有了,命令来查看,找到并杀掉进程。
有没有更简便的办法呢,肯定是有的,既然上面用到了DOS命令,那么用批处理脚本结合上述命令不就很容易做我们想做的事了吗。
所以我查阅相关资料,查看了网上各路大神的博文,试着写了一段批处理脚本,该脚本可以杀掉指定端口的进程,这里贴出来仅供参考。脚本如下,只需保存为.bat文件即可,出现乱码则需要调整文件编码为ANSI。 在windows直接新建文本文件,直接保存(中文默认GBK),就不会出现乱码问题:
懒人下载:点此下载
@echo off
:: 检查权限
>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system"
:: 如果上一条语句执行返回错误标志为 0,则表示当前非管理员权限运行
if '%errorlevel%' NEQ '0' (
echo 正在请求管理员权限...
goto UACPrompt
) else ( goto gotAdmin )
:UACPrompt
:: 创建并执行vbs脚本
echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
echo UAC.ShellExecute "%~s0", "", "", "runas", 1 >> "%temp%\getadmin.vbs"
"%temp%\getadmin.vbs"
exit /B
:gotAdmin
:: 删除获取权限的vbs脚本
if exist "%temp%\getadmin.vbs" ( del "%temp%\getadmin.vbs" )
pushd "%CD%"
CD /D "%~dp0"
:: 允许变量延迟扩展
setlocal enabledelayedexpansion
title 关闭端口对应进程
echo 请谨慎操作,关闭某些特殊的进程可能会带来一些不稳定因素
set /p value=请输入端口号:
set a=0
for /f "tokens=*" %%i in ('netstat -aon ^| findstr "%value%"') do (
set a=%%i
set a=!a:~69,10!
)
:: 判断是否得到了进程id
if %a% equ 0 (
goto cannotGetPid
) else (
goto gotPid
)
:gotPid
:: 获取任务列表对应的任务名,以便判断需要结束的进程是否是期望值
for /f "tokens=*" %%i in ('tasklist ^| findstr "%a%"') do (
set b=%%i
set b=!b:~0,20!
)
:: 去除左边空格
:intercept_b
if "%b:~-1%"==" " set "b=%b:~0,-1%"&goto intercept_b
color c
set /p in=已找到端口 %value% 的相关进程 %b%, 请 #谨慎# 决定是否结束该进程?(y/n)
color f
:: 强行结束进程
if '%in%' == 'y' (
taskkill /F /pid %a%
echo 已结束进程, 按任意键退出
) else (
echo 放弃执行, 按任意键退出
)
pause>nul
exit
:cannotGetPid
echo 未找打端口号 %value% 的相关进程, 按任意键退出
pause>nul
exit