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

已發表: 2022-10-08
顯示 bash 提示符的 Linux 筆記本電腦
fatmawati achmad zaenuri/Shutterstock.com

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

殺死進程

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

如何從 Linux 終端殺死進程
相關如何從 Linux 終端殺死進程

無論您的動機是什麼,都可以通過 Linux 命令行終止進程。 經典的方法是使用帶有您要終止的進程的進程 ID 的 kill 命令。 kill命令有一些近親。 pkill命令將按名稱殺死一個進程,而killall將殺死它可以找到的共享名稱的所有進程。

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

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

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

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

使用 socat 創建連接

所以我們有一些連接要殺死,我們將使用socat使用不同的協議創建網絡連接。 您需要安裝socat 。 要在 Ubuntu 上安裝它,請使用以下命令:

 sudo apt install socat 

在 Ubuntu 上安裝 socat

在 Fedora 上使用dnf

 須藤 dnf 安裝 socat 

在 Fedora 上安裝 socat

在 Manjaro 上,您需要輸入:

 sudo pacman -S socat 

在 Manjaro 上安裝 socat

socat的語法很簡單,如果有點囉嗦的話。 我們需要提供源地址和目標地址。 對於其中的每一個,我們都需要提供協議、IP 地址和端口號。 我們可以將 STDIN 或 STDOUT 替換為源或目標。

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

 socat tcp-listen:7889,bind=127.0.0.1 標準輸出 & 

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

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

 socat udp-listen:7889,bind=127.0.0.1 標準輸出 &
 socat sctp-listen:9999,bind=127.0.0.1 標準輸出 & 

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

相關: TCP 和 UDP 有什麼區別?

使用殺死

當然,我們可以使用kill來終止進程,只要我們知道進程的ID是什麼即可。 要查找 PID,我們可以使用lsof命令。

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

 lsof -i tcp:7889 

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

這個進程的 PID 是 3141,我們可以繼續使用kill

 須藤殺死 3141

如果我們使用管道,我們可以節省一些精力。 如果我們將lsof的輸出通過管道傳輸到awk並告訴awk搜索包含我們感興趣的端口(7889)的行並打印該行的第二個字段,我們將隔離 PID。

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

將 lsof 的輸出通過管道傳輸到 awk

然後,我們可以使用xargsawk的輸出通過管道傳輸到kill命令中。 xargs命令接受其管道輸入並將其作為命令行參數傳遞給另一個命令。 我們將xargskill命令一起使用。

 lsof -i tcp:7889 | awk '/7889/{打印 $2}' | xargs 殺死

使用管道將 lsof 的輸出帶入 awk 並從 awk 帶入 xargs 並殺死

我們沒有得到任何視覺反饋。 在典型的 Linux 方式中,沒有消息就是好消息。 如果要檢查進程是否已終止,可以再次使用lsof

 lsof -i tcp:7889 

使用 lsof 搜索使用特定端口和協議的進程的詳細信息而沒有成功

因為lsof沒有報告任何內容,所以我們知道沒有這種聯繫。

我們可以使用 UDP 協議刪除進程,只需在前面的命令中將“tcp”替換為“udp”即可。

 lsof -i udp:7889 | awk '/7889/{打印 $2}' | xargs 殺死

使用管道將 lsof 的輸出帶入 awk 並從 awk 帶入 xargs 並殺死,用於 UDP 套接字

但是, lsof不識別 SCTP 協議。

 lsof -i sctp:7889 

lsof 不適用於 SCTP 協議

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

 ss-樹液

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

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

我們將ss的輸出通過管道傳輸到grep並蒐索我們的端口號 7889。我們將grep的輸出通過管道傳輸到awk 。 在awk中,我們使用-F (分隔符字符串)選項將逗號“ , ”設置為字段分隔符。 我們搜索包含“pid=”的字符串,並從該字符串中打印第二個逗號分隔的字段。

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

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

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

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

 ss-樹液| grep "7889" | awk -F',' '/pid=/{print $2}' | awk -F'=''{打印 $2}' 

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

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

 ss-樹液| grep "7889" | awk -F',' '/pid=/{print $2}' | awk -F'=''{打印 $2}' | xargs 殺死

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

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

定影器命令

fuser命令大大簡化了事情。 缺點是它僅適用於 TCP 和 UDP 套接字。 從好的方面來說,這是您需要處理的兩種最常見的套接字類型。 fuser命令已經安裝在我們檢查的 Ubuntu、Fedora 和 Manjaro 計算機上。

您需要做的就是使用-k (kill)選項,並提供端口和協議。 您可以使用-n (命名空間)選項並提供協議和端口,或者使用“正斜杠快捷格式”並將端口號放在首位。

 定影器-n tcp 7889
 熱熔器 7889/udp 

使用 fuser 命令刪除使用 TCP 和 UDP 套接字的進程

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

首先嘗試定影器

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