如何通過端口號殺死Linux進程

如何通過端口號殺死Linux進程

要終止 Linux 進程,您需要它的 ID 或名稱。如果你只知道它正在使用的端口,你能殺死它嗎?是的,有幾種不同的方式。

殺死進程

有時,Linux 進程可能會變得無響應。它可能會停止正常工作,或者繼續工作但忽略關閉它的請求,或者開始消耗內存、CPU 或網絡帶寬。

無論您的動機是什麼,都可以通過 Linux 命令行終止進程。經典的方法是使用帶有要殺死的進程的 id 的 kill 命令。該kill團隊有幾個近親。該命令pkill將按名稱終止進程,killall並將終止它可以找到共享部分名稱的任何進程。

如果您只知道某個進程正在使用您計算機上的某個端口,那麼仍然有辦法識別並殺死它。在網絡術語中,“端口”可以表示您將帶有插頭的電纜插入其中的物理連接,例如CAT5 或 6 網絡電纜,也可以表示軟件端口。

軟件端口是網絡連接的最後一部分。設備 IP 地址標識計算機或其他網絡設備。計算機內的應用程序使用不同的端口。它們提供了不同級別的詳細信息。網絡流量使用 IP 地址到達正確的計算機,並且通過端口尋址,可以將其傳送到正確的應用程序。

這類似於郵政郵件如何到達酒店,然後被分類並遞送到適當的房間。IP 地址就像酒店的街道地址,房間號就像端口號。

如果您在端口上看到網絡活動並且不識別創建它的進程,或者如果它的行為導致問題或懷疑,您可能想要終止該進程。即使您只知道端口號,您也可以跟踪該進程並將其終止。

與 socat 建立聯繫

為了讓我們能夠殺死多個連接,我們將使用socat不同的協議來創建網絡連接。您將需要安裝socat. 要在 Ubuntu 上安裝它,請使用以下命令:

sudo apt install socat

在 Ubuntu 上安裝套接字

在 Fedora 上使用dnf

sudo dnf install socat

在 Fedora 上安裝套接字

在 Manjaro 上,您需要輸入:

sudo pacman -S socat

在 Manjaro 上安裝果汁

語法socat很簡單,雖然有點冗長。我們需要指定源地址和目標地址。對於它們中的每一個,我們需要指定協議、IP 地址和端口號。我們可以將 STDIN 或 STDOUT 替換為源或目標。

此命令在端口 7889 上的 TCP 偵聽套接字、環回 IP 地址 127.0.0.1 和 STDOUT 之間創建連接。與號“ &”在後台運行命令,因此我們保留對命令行的訪問權限。

socat tcp-listen:7889,bind=127.0.0.1 stdout &

使用 socat 創建一個監聽 TCP 套接字連接

我們將再創建兩個連接,以便我們有少量使用不同協議的套接字。我們將創建一個 UDP連接和一個SCTP連接。命令中唯一改變的部分是協議。

socat udp-listen:7889,bind=127.0.0.1 stdout & socat sctp-listen:9999,bind=127.0.0.1 stdout &

使用 socat 創建 UDP 和 SCTP 套接字偵聽連接

使用暗殺

當然kill,如果我們知道進程 ID,我們可以使用它來終止進程。要查找 PID,我們可以使用 lsof命令。

要列出使用 TCP 協議的端口 7889 上的進程的詳細信息,我們使用-i(internet address) 選項,如下所示。

lsof -i tcp:7889

使用 lsof 顯示使用特定端口和協議的進程的詳細信息。

此進程的 PID 為 3141,我們可以將其用於kill

sudo kill 3141

如果我們使用管道,我們可以節省一些精力。如果我們將輸出定向lsofawk命令awk以查找包含我們感興趣的端口的行 – 7889 – 並從該行打印第二個字段,我們將隔離 PID。

lsof -i tcp:7889 | awk '/7889/{print $2}'

管道 lsof 輸出到 awk

然後我們可以使用管道將輸出awk傳遞kill給命令xargs。命令xargs通過管道獲取輸入並將其作為命令行參數傳遞給另一個命令。我們將xargskill團隊一起使用。

lsof -i tcp:7889 | awk '/7889/{print $2}' | xargs kill

使用管道將 lsof 輸出通過管道傳輸到 awk 並從 awk 傳輸到 xargs 並殺死

我們沒有得到任何視覺反饋。在典型的 Linux 時尚中,沒有消息就是好消息。如果您想確保該過程已完成,您可以lsof再次使用。

lsof -i tcp:7889

使用 lsof 使用特定端口和協議查找進程詳細信息但未成功

由於lsof它沒有報告任何內容,因此我們知道沒有這種聯繫。

我們可以通過簡單地將前面命令中的“tcp”替換為“udp”來刪除使用 UDP 協議的進程。

lsof -i udp:7889 | awk '/7889/{print $2}' | xargs kill

使用管道將 lsof 輸出通過管道傳輸到 awk 以及從 awk 到 xargs 並為 UDP 套接字終止

但是,lsof它不識別 SCTP 協議。

lsof -i sctp:7889

lsof 不適用於 SCTP 協議

我們可以使用ss命令來做到這一點。我們使用-S(SCTP) 選項搜索 SCTP 套接字,使用-a(all) 選項搜索所有類型的套接字(偵聽、接收、連接等),使用-p(processes) 選項列出有關進程的信息插座。

ss -Sap

使用帶有 ss 的 SCTP 套接字打印進程詳細信息

我們可以使用grepand解析這個輸出awk。我們也可以用grep一些 PERL 正則表達式來解析它,但是這種方式更容易理解。如果您要使用它不止一次或兩次,您可能會將其設為別名或 shell 函數。

我們將從ssto 發送輸出grep並找到我們的端口號 7889。我們將從grepto發送輸出awk。在awk中,我們使用-F(分隔符字符串)選項設置逗號“ ,”作為字段分隔符。我們查找包含“pid=”的行並從該行打印第二個逗號分隔的字段。

ss -Sap | grep "7889"| awk -F',' '/pid=/{print $2}'

使用管道連接ss、grep和awk提取PID字符串

這給了我們字符串“pid=2859”。

我們可以awk再次傳入,將字段分隔符設置為等號“ =”,然後打印該行的第二個字段,這將是等號後面的文本。

ss -Sap | grep "7889"| awk -F',' '/pid=/{print $2}' | awk -F'=' '{print $2}'

使用管道連接ss、grep和awk兩次提取PID

我們現在已經隔離了進程 ID。我們可以使用 PID 作為命令行參數xargs來傳遞。kill

ss -Sap | grep "7889"| awk -F',' '/pid=/{print $2}' | awk -F'=' '{print $2}' | xargs kill

使用帶有 ss、grep、awk 和 xargs 的管道來終止 SCTP 套接字進程

這會殺死在端口 7889 上使用 SCTP 協議套接字的進程。

定影團隊

該命令fuser大大簡化了工作。缺點是它只適用於 TCP 和 UDP 套接字。從好的方面來說,這是您需要處理的兩種最常見的套接字類型。該命令fuser已經安裝在我們測試的 Ubuntu、Fedora 和 Manjaro 機器上。

您所要做的就是使用-k(kill) 選項並指定端口和協議。您可以使用-n(namespace) 選項並指定協議和端口,或者使用“斜線標籤格式”並首先指定端口號。

fuser -n tcp 7889 fuser 7889/udp

使用 fuser 命令殺死使用 TCP 和 UDP 套接字的進程

已完成進程的端口號、協議和 PID 打印在終端窗口中。

先試試熱熔器

它很可能會安裝在您正在使用的計算機上,並且協議很可能是 TCP 或 UDP,因此最簡單的方法很可能適合您。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *