【问题标题】:How to make sure that a certain Port is not occupied by any other process如何确保某个端口没有被任何其他进程占用
【发布时间】:2012-02-07 16:54:18
【问题描述】:

我正在 Windows 环境中开发 Java EE 应用程序。 (我使用的是 Windows 7)

我正在使用 Tomcat 服务器,不幸的是端口号 8080 正忙(由 Oracle 使用)。现在我想为 Tomcat 分配一个不同的端口。

所以在更改 conf/server.xml 文件之前,我想确保某个端口没有被任何其他进程占用并且它是空闲的。

【问题讨论】:

    标签: windows networking


    【解决方案1】:

    您可以使用“netstat”来检查端口是否可用。

    使用netstat -anp | find "port number" 命令查看端口是否被另一个进程占用。如果它被另一个进程占用,它将显示该进程的进程ID。

    您必须在端口号之前加上 : 才能获得实际输出

    netstat -anp | find ":8080"

    【讨论】:

    • 感谢您的回答,正如我所说,我在 Windows 命令提示符 C:\Users\kiran>netstat -anp | 上执行了以下命令find 8086 它显示 FIND: Parameter format not correct
    • 你应该用引号覆盖端口号。例如,netstat -ano |找到“8086”
    • 我复制粘贴了命令并在命令提示符下执行了相同的命令,它没有显示任何内容。
    • 表示没有进程占用该端口号。如果您不确定,请尝试使用 SysInternals 的 TCP 查看器并检查端口是否列在其中。
    • 在 Windows 10 中不工作。“netstat -ano|findstr port no”工作正常
    【解决方案2】:

    我是netstat -ano|findstr port no

    结果将在最后一列显示进程 ID

    【讨论】:

    • netstat -ano|findstr 3306 运行此命令时没有任何反应
    • @sam 基于答案netstat -ano | find ":3306"
    • @MostafaFallah 答案对我有用。任何人,记得尝试其他端口,以便更好地了解该命令的工作原理。
    【解决方案3】:

    netstat -ano|find ":port_no" 会给你名单。
    a:显示所有连接和监听端口。
    n:以数字形式显示地址和端口号。
    o:显示与每个连接关联的拥有进程 ID。

    示例:netstat -ano | find ":1900" 这会给你这样的结果。

    UDP    107.109.121.196:1900   *:*                                    1324  
    UDP    127.0.0.1:1900         *:*                                    1324  
    UDP    [::1]:1900             *:*                                    1324  
    UDP    [fe80::8db8:d9cc:12a8:2262%13]:1900  *:*                      1324
    

    【讨论】:

    • > nestat -ano | find ":443"netstat: illegal option -- o
    • 这是适用于 Windows 7-64 的命令。在 XAMPP Apache 服务器关闭的情况下进行测试,端口 80 上什么也没有出现。同样启动时,端口 80 显示了一个条目,正如预期的那样。
    【解决方案4】:

    它是 (Get-NetTCPConnection -LocalPort "端口号").OwningProcess

    【讨论】:

    • 它显示此错误 Get-NetTCPConnection : No MSFT_NetTCPConnection objects found with property 'LocalPort' 等于 '55283'。验证属性的值并重试。在 line:1 char:2 + (Get-NetTCPConnection -LocalPort "55283").OwningProcess + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~ + CategoryInfo : ObjectNotFound: (55283:UInt16) [Get-NetTCPConnection], CimJobException + FullyQualifiedErrorId : CmdletizationQuery_NotFound_LocalPort,Get-NetTCPConnection
    【解决方案5】:

    如果您更喜欢 Powershell,请使用它。您将获得进程的名称。

    PS C:\Users\Administrator> Get-Process -Id (Get-NetTCPConnection -LocalPort 9093).OwningProcess
    
    Handles  NPM(K)    PM(K)      WS(K)     CPU(s)     Id  SI ProcessName
    -------  ------    -----      -----     ------     --  -- -----------
       6021    1464  2760976    2131548     290.39  25512   2 java
    

    PID 在Id 列中,它还提供进程名称。

    如果没有进程正在使用此端口,您会收到一条红色错误消息。

    如果你想杀死 PID 25512 的进程,使用

    taskkill /PID 25512 /F
    

    /F表示强制,有些进程没有/F是无法杀死的

    【讨论】:

      【解决方案6】:

      如果这纯粹是本地问题,例如您想在本地运行 tomcat 来测试您正在处理的应用程序,通常可以配置端口0。在这种情况下,当应用程序端口绑定时,操作系统将为其分配一个随机的“临时”端口,希望它注销。

      您必须检查 tomcat 是否支持它,但我希望它会得到past answers mentioning it

      它避免了硬编码端口和TOCTOU 的问题,尽管它显然不太方便,因为您每次都需要获取需要连接的端口。

      另一种方法是尝试一堆免费端口,例如8000[0] 和 8888 是 HTTP 服务器的常用备用端口。 8008 也是一个官方 IANA 备用端口,但我不记得曾经使用过它。

      [0] 虽然正式分配给 iRDMI

      【讨论】:

        猜你喜欢
        • 2014-08-22
        • 1970-01-01
        • 2012-06-07
        • 2010-12-29
        • 2015-08-25
        • 2014-10-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多