257

我从 java 类中打开端口 #5955 以与客户端通信。完成后如何关闭此端口?还有哪个命令可以告诉我端口是打开还是关闭?

4

14 回答 14

496
  1. 找出占用您想要释放的端口号(例如 5955)的进程 ID (PID)

    sudo lsof -i :5955
    
  2. 使用其 PID 杀死当前正在使用该端口的进程

    sudo kill -9 PID
    
于 2013-07-17T14:48:05.357 回答
74

要查找该过程,请尝试:

sudo lsof -i :portNumber

使用其 PID 杀死当前正在使用该端口的进程

kill PID

然后检查端口是否关闭。如果没有,请尝试:

kill -9 PID

如果前一个不起作用,我只会执行以下操作

sudo kill -9 PID

只是为了安全。再次取决于您打开端口的方式,这可能无关紧要。

于 2015-10-06T05:55:14.260 回答
49

在 2018 年,这对我使用 MacOS HighSierra 有用:

sudo lsof -nPi :yourPortNumber

然后:

sudo kill -9 yourPIDnumber

于 2018-12-19T05:18:30.603 回答
33

很简单的找到5900端口:

sudo lsof -i :5900

然后将 59553 视为 PID

sudo kill 59553
于 2018-11-10T07:14:10.780 回答
30

无论您如何打开端口,都以相同的方式关闭它。例如,如果您创建了一个套接字,将其绑定到端口 0.0.0.0:5955,并调用 listen,关闭同一个套接字。

您也可以直接终止打开端口的进程。

如果您想找出哪个进程打开了端口,请尝试以下操作:

lsof -i :5955

如果你想知道一个端口是否打开,你可以执行相同的 lsof 命令(如果任何进程打开它,它是打开的;否则,它不是),或者你可以尝试连接它,例如:

nc localhost 5955

如果它立即返回而没有输出,则端口未打开。

值得一提的是,从技术上讲,它不是开放的端口,而是主机:端口组合。例如,如果您以 10.0.1.2 的身份插入 LAN,则可以将套接字绑定到 127.0.0.1:5955 或 10.0.1.2:5955,其中一个不会影响另一个,或者您可以绑定到 0.0.0.0 :5955 同时处理两者。您可以查看计算机的所有 IPv4 和 IPv6 地址ifconfig您可以使用该命令

于 2012-09-12T22:57:26.977 回答
28

一个班轮是最好的

kill -9 $(lsof -i:PORT -t) 2> /dev/null

示例:在 mac 上,想清除端口 9604。以下命令就像一个魅力

 kill -9 $(lsof -i:9604 -t) 2> /dev/null 
于 2019-11-06T10:01:08.220 回答
8

您还可以使用第一个命令来终止拥有特定端口的进程:

sudo netstat -ap | grep :<port_number>

例如,假设这个进程持有TCP 8000端口,然后运行命令:

sudo netstat -ap | grep :8000

将输出与持有端口8000的进程对应的行,例如:

tcp  0  0 *:8000   *:* LISTEN  4683/procHoldingPort

在这种情况下,procHoldingPort是打开端口的进程的名称,4683是它的 pid,8000(注意它是 TCP)是它持有的端口号(您希望关闭它)。

然后按照上面的例子杀死进程:

kill  4683

正如其他人在这里提到的那样,如果这不起作用(您可以尝试使用 kill 和 -9 作为参数):

kill -9 4683

同样,一般来说,如果可以的话,最好避免发送SIGKILL(-9)。

于 2017-11-10T13:11:47.447 回答
5

如上所述,我使用lsof组合 with ;kill但是写了一个快速的小 bash 脚本来自动化这个过程。

使用此脚本,您可以killport 3000在任何地方简单地键入,它会杀死在 port 上运行的所有进程3000

https://github.com/xtrasimplicity/killport

于 2016-03-06T08:34:45.263 回答
5

为此,我创建了一个函数。

function free_port() {
    if [ -z $1 ] 
    then
        echo no Port given
    else
        PORT=$1;
        PID=$(sudo lsof -i :$PORT) # store the PID, that is using this port 

        if [ -z $PID ] 
        then
            echo port: $PORT is already free.
        else
            sudo kill -9 $PID # kill the process, which frees the port
            echo port: $PORT is now free.
        fi
    fi
}

free_port 80 # you need to change this port number

在您的终端中复制并粘贴这段代码应该可以释放您想要的端口。请记住在最后一行更改端口号。

于 2018-10-27T07:59:45.723 回答
3

试试下面,假设正在运行的端口是8000

free-port() { kill "$(lsof -t -i :8000)"; }

我在这里找到了参考

于 2018-12-08T13:09:15.690 回答
2

这似乎对我有用。只需将 your_port_number 更改为您要停止的端口号。

sudo lsof -t -i tcp:your_port_number | xargs 杀死 -9

于 2021-09-08T13:46:47.280 回答
2

使用命令查找进程 ID

lsof -n -i4TCP:8080 

得到processId后

sudo kill -9 processID

然后提供您的系统密码。

于 2021-09-22T06:46:47.683 回答
1

当打开端口的程序退出时,端口会自动关闭。如果您终止运行此服务器的 Java 进程,则应该这样做。

于 2012-09-28T06:03:48.227 回答
-2
  1. 首先找出占用了所需端口的Procees id(pid)。(例如5434)

    ps辅助| grep 5434

2.杀死那个进程

   kill -9 <pid>
于 2015-07-31T11:52:37.050 回答