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


197

我从Java类打开了端口#5955,以便从客户端进行通信。完成后如何关闭该端口?以及哪个命令可以显示端口是打开还是关闭?


1
您是如何打开那个港口的?目前尚不清楚您是在谈论打开还是关闭Java应用程序中的端口或从防火墙中关闭端口。
mariosangiorgio 2012年

Answers:


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

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

    sudo kill -9 PID
    

32
发送-9不应是杀死进程的第一个尝试,这是一个非常不好的习惯。我记得,您应该首先使用kill PID(表示-15),然后尝试-2和-1。-9是只有在万不得已的每个其他选项未能奏效。
喵喵

3
确实按@Meow的建议杀死了没有任何标志的pID,这对我有用
Toni Leigh

39

要找到该过程,请尝试:

sudo lsof -i :portNumber

使用其PID终止当前正在使用端口的进程

kill PID

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

kill -9 PID

如果以前没有用,我只会做以下事情

sudo kill -9 PID

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


25

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

您也可以只取消打开端口的进程。

如果要找出打开端口的进程,请尝试以下操作:

lsof -i :5955

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

nc localhost 5955

如果它立即返回但没有输出,则说明该端口未打开。

值得一提的是,从技术上讲,它不是开放的端口,而是host:port组合。例如,如果您以10.0.1.2的方式插入LAN,则可以将套接字绑定到127.0.0.1:5955或10.0.1.2:5955,而一个都不影响另一个,也可以绑定到0.0.0.0 :5955可同时处理这两个问题。您可以使用以下ifconfig命令查看计算机的所有IPv4和IPv6地址。


24

非常简单地找到端口5900:

sudo lsof -i :5900

然后考虑将59553作为PID

sudo kill 59553

1
这不会为现有答案添加任何内容!
hatef

16

在2018年,这是使用MacOS HighSierra对我有用的功能:

须藤lsof -nPi:yourPortNumber

然后:

sudo kill -9 yourPIDnumber


1
lsof -nPi稍微好一点,因为端口号实际上在输出中可见,并且您可以更好地了解要杀死的内容。
Rich Stone

1
看看所有监听端口的信息也很有帮助:sudo lsof -nPi | grep LISTEN
leanne

14

一支班轮最好

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

示例:在Mac上,想要清除端口9604。

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

6

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

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)。

干杯,

伙计


5

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

使用此脚本,您只需killport 3000在任何地方键入即可,它将杀死port上运行的所有进程3000

https://github.com/xtrasimplicity/killport


1
你救了我的日子。出于某种原因lsof,与结合使用kill并没有返回任何内容,并使我的脚本在macOS Sierra上挂起。但是,它的killport工作原理就像一种魅力,而且速度更快。谢谢!
wout

4

我为此创建了一个函数。

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

在终端中复制并粘贴此代码块可以释放所需的端口。只记得在最后一行更改端口号。


3

尝试以下操作,假设正在运行的端口为8000

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

我在这里找到了参考


1

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


-1
  1. 首先找出占用了所需端口的Procees ID(pid)(例如5434)

    ps aux | grep 5434

2.杀死那个过程

   kill -9 <pid>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.