簡體   English   中英

如何從 Mac 上的終端關閉打開的端口?

[英]How do I close an open port from the terminal on the Mac?

我從 java 類中打開端口 #5955 以與客戶端通信。 完成后如何關閉此端口? 還有哪個命令可以告訴我端口是打開還是關閉?

  1. 找出占用您想要釋放的端口號(例如 5955)的進程 ID (PID)

     sudo lsof -i :5955
  2. 使用其 PID 殺死當前正在使用該端口的進程

    sudo kill -9 PID

要查找該過程,請嘗試:

sudo lsof -i :portNumber

使用其 PID 殺死當前正在使用該端口的進程

kill PID

然后檢查端口是否關閉。 如果沒有,請嘗試:

kill -9 PID

如果前一個不起作用,我只會執行以下操作

sudo kill -9 PID

只是為了安全。 再次取決於您打開端口的方式,這可能無關緊要。

在 2018 年,這對我使用 MacOS HighSierra 有用:

sudo lsof -nPi :yourPortNumber

然后:

sudo kill -9 yourPIDnumber

很簡單的找到5900端口:

sudo lsof -i :5900

然后將 59553 視為 PID

sudo kill 59553

無論您如何打開端口,都以相同的方式關閉它。 例如,如果您創建了一個套接字,將其綁定到端口 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 地址。

一個班輪是最好的

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

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

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

您還可以使用第一個命令來終止擁有特定端口的進程:

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

使用命令查找進程 ID

lsof -n -i4TCP:8080 

得到processId后

sudo kill -9 processID

然后提供您的系統密碼。

為此,我創建了一個函數。

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

在您的終端中復制並粘貼這段代碼應該可以釋放您想要的端口。 請記住在最后一行更改端口號。

如上所述,我將lsofkill結合使用; 但是寫了一個快速的小 bash 腳本來自動化這個過程。

使用此腳本,您可以在任何地方簡單地鍵入killport 3000 ,它將殺死在端口3000上運行的所有進程。

https://github.com/xtrasimplicity/killport

試試下面,假設運行端口是8000

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

我在這里找到了參考

這似乎對我有用。 只需將 your_port_number 更改為您要停止的端口號。

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

當打開端口的程序退出時,端口會自動關閉。 如果您終止運行此服務器的 Java 進程,則應該這樣做。

跆拳道。 我想關閉套接字而沒有進程終止。

2022 年更新

今天有一種比其他命令更直接的命令(沒有 Sudo 或多行)要殺死端口 8080,只需調用:

lsof -ti tcp:8080 | xargs kill

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

    ps輔助| grep 5434

2.殺死那個進程

   kill -9 <pid>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM