背景:IDEA老时假死,导致重启服务说占用端口,然后Windwos的查端口号进程命令太难背了,直接索性做成脚本算了
概述
仓库源码、打包好后的工具包以及使用文档:请移步到这,顺便随手点点星星哦!
功能列表
- 端口查进程号
- 进程号查端口号
- 杀进程通过进程号
- 杀进程通过端口号
功能展示
帮助文档
端口查进程号
进程号查端口号
杀进程通过进程号
杀进程通过端口号
核心代码
LinuxCMD.java
@Resource(name= CMDFactory.LINUX)
public class LinuxCMD implements CMD {
private final String allPort2processCMD = "netstat -tunlp";
private final String killProcessCMD = "kill -9 {}";
private LinuxCMD() {};
@Override
public List<Integer> getPort(Integer processId) {
Assert.notNull(processId,"获取端口号失败:进程号缺失,请检查");
List<String> allPortResults = RuntimeUtil.execForLines(allPort2processCMD);
List<Integer> targetPortProcessId = allPortResults.stream()
.map(line -> StrUtil.splitTrim(line, StrUtil.SPACE))
.filter(lineElems -> StrUtil.startWith(CollUtil.getLast(lineElems), StrUtil.format("{}/", processId)))
.map(lineElems -> CollUtil.get(lineElems, 3))
.map(localAddress -> StrUtil.subAfter(localAddress, StrUtil.COLON,true))
.filter(StrUtil::isNotBlank)
.map(StrUtil::trimToEmpty)
.map(Convert::toInt)
.distinct()
.sorted()
.collect(Collectors.toList());
return targetPortProcessId;
}
@Override
public List<Integer> getProcessId(Integer port) {
Assert.notNull(port,"获取进程号失败:端口号缺失,请检查");
List<String> allPortResults = RuntimeUtil.execForLines(allPort2processCMD);
List<Integer> targetPortProcessId = allPortResults.stream()
.map(line -> StrUtil.splitTrim(line, StrUtil.SPACE))
.filter(line -> StrUtil.endWith(CollUtil.get(line,3), StrUtil.format(":{}", port)))
.map(lineElems -> CollUtil.getLast(lineElems))
.map(programs -> StrUtil.subBefore(programs, StrUtil.SLASH,false))
.filter(StrUtil::isNotBlank)
.map(StrUtil::trimToEmpty)
.map(Convert::toInt)
.distinct()
.sorted()
.collect(Collectors.toList());
return targetPortProcessId;
}
@Override
public String killProcess(Integer processId) {
Assert.notNull(processId,"杀进程失败:进程号缺失,请检查");
String actualKillProcessCMD = StrUtil.format(killProcessCMD, processId);
String execResult = RuntimeUtil.execForStr(actualKillProcessCMD);
return StrUtil.trimToEmpty(StrUtil.blankToDefault(execResult,"成功"));
}
}
WindowsCMD.java
@Resource(name= CMDFactory.WINDOWS)
public class WindowsCMD implements CMD {
private final String allPort2processCMD = "netstat -ano";
private final String killProcessCMD = "taskkill /pid {} /f";
private WindowsCMD() {};
@Override
public List<Integer> getPort(Integer processId) {
Assert.notNull(processId,"获取端口号失败:进程号缺失,请检查");
List<String> allPortResults = RuntimeUtil.execForLines(allPort2processCMD);
List<Integer> targetProcessIdPort = allPortResults.stream()
.map(line -> StrUtil.splitTrim(line, StrUtil.SPACE))
.filter(lineElems -> StrUtil.equals(CollUtil.getLast(lineElems), Convert.toStr(processId)))
.map(lineElems -> CollUtil.get(lineElems, 1))
.map(localAddress -> StrUtil.subAfter(localAddress,StrUtil.COLON, true))
.filter(StrUtil::isNotBlank)
.map(Convert::toInt)
.distinct()
.sorted()
.collect(Collectors.toList());
return targetProcessIdPort;
}
@Override
public List<Integer> getProcessId(Integer port) {
Assert.notNull(port,"获取进程号失败:端口号缺失,请检查");
List<String> allPortResults = RuntimeUtil.execForLines(allPort2processCMD);
List<Integer> targetPortProcessId = allPortResults.stream()
.map(line -> StrUtil.splitTrim(line, StrUtil.SPACE))
.filter(lineElements -> StrUtil.contains(CollUtil.get(lineElements,1), StrUtil.format(":{}", port)))
.map(lineElems -> CollUtil.getLast(lineElems))
.filter(StrUtil::isNotBlank)
.map(StrUtil::trimToEmpty)
.map(Convert::toInt)
.distinct()
.sorted()
.collect(Collectors.toList());
return targetPortProcessId;
}
@Override
public String killProcess(Integer processId) {
Assert.notNull(processId,"杀进程失败:进程号缺失,请检查");
String actualKillProcessCMD = StrUtil.format(killProcessCMD, processId);
String execResult = StrUtil.trimToEmpty(RuntimeUtil.execForStr(actualKillProcessCMD));
return StrUtil.blankToDefault(execResult, "成功");
}
}