如何从 Mac 上的终端关闭开放端口?

问题描述 投票:0回答:16

我从 java 类打开端口 #5955 以与客户端进行通信。完成后如何关闭此端口?哪个命令可以显示端口是否打开或关闭?

macos port
16个回答
606
投票
  1. 找出正在占用您想要释放的端口号(例如5955)的进程ID(PID)

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

    sudo kill -9 PID
    

104
投票

要查找进程,请尝试:

sudo lsof -i :portNumber

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

kill PID

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

kill -9 PID

如果前面的方法不起作用,我只会执行以下操作

sudo kill -9 PID

只是为了安全起见。同样取决于您打开端口的方式,这可能并不重要。


72
投票

编辑

在 09/2022 年,这对我的 MacOS Monterey M1 Pro 芯片有帮助:

sudo lsof -t -i tcp:yourPortNumber | sudo xargs kill

2018 年,以下是我使用 MacOS HighSierra 的效果:

sudo lsof -nPi :yourPortNumber

然后:

sudo kill -9 yourPIDnumber


37
投票

非常简单找到端口5900:

sudo lsof -i :5900

然后考虑59553作为PID

sudo kill 59553

33
投票

最好有一个衬垫

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

示例: 在 Mac 上,想要清除端口 9604。以下命令非常有效

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

32
投票

无论您如何打开端口,都以相同的方式关闭它。例如,如果您创建了一个套接字,将其绑定到端口 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 同时处理两者。您可以使用

ifconfig
命令查看计算机的所有 IPv4 和 IPv6 地址。


8
投票

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

sudo netstat -ap | grep :<port_number>

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

sudo netstat -ap | grep :8000

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

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

在本例中,procHoldingPort是打开端口的进程的名称,4683是它的pid,8000(注意是TCP)是它持有的端口号(您希望关闭的)。

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

kill  4683

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

kill -9 4683

再次强调,一般来说,如果可以的话,最好避免发送

SIGKILL
(-9)。


8
投票

使用命令查找进程ID

lsof -n -i4TCP:8080 

获取processId后

sudo kill -9 processID

然后提供您的系统密码。


6
投票

我将

lsof
kill
结合使用,如上所述;但编写了一个快速的小 bash 脚本来自动化此过程。

使用此脚本,您只需从任何地方键入

killport 3000
,它将杀死端口
3000
上运行的所有进程。

https://github.com/xtrasimplicity/killport


6
投票

我为此目的创建了一个函数。

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

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


6
投票

简单的单行线

今天有一种比其他命令更简单的命令(没有 Sudo、包或多行) 要终止端口 8080,只需调用:

lsof -ti tcp:8080 | xargs kill


4
投票

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

sudo lsof -t -i tcp:your_port_number | xargs kill -9

3
投票

尝试下面,假设运行端口是

8000
:

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

我找到了参考这里


1
投票

当打开端口的程序退出时,该端口将自动关闭。如果你杀死运行该服务器的 Java 进程,就可以了。


0
投票

对于 Linux/macOS:
第1步:

sudo lsof -i :5955

第2步: 请注意打印输出中显示的 PID(进程 ID)值。
第三步:

kill <PID>

-2
投票
  1. 首先找出占用了所需端口的Procees id(pid)。(例如5434)

    ps 辅助 | grep 5434

2.杀死该进程

   kill -9 <pid>
© www.soinside.com 2019 - 2024. All rights reserved.