Java常用脚本:查询、杀进程脚本(支持Linux、Windows)

背景:IDEA老时假死,导致重启服务说占用端口,然后Windwos的查端口号进程命令太难背了,直接索性做成脚本算了

概述

仓库源码、打包好后的工具包以及使用文档:请移步到这,顺便随手点点星星哦!

功能列表

  1. 端口查进程号
  2. 进程号查端口号
  3. 杀进程通过进程号
  4. 杀进程通过端口号

功能展示

帮助文档

在这里插入图片描述

端口查进程号

在这里插入图片描述

进程号查端口号

在这里插入图片描述

杀进程通过进程号

在这里插入图片描述

杀进程通过端口号

在这里插入图片描述

核心代码

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, "成功");
    }
}

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值