如何通過端口號殺死一個linux進程

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

屠宰過程

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

無論出於何種原因,都可以通過 Linux 命令行終止進程。 經典的方法是使用帶有要殺死的進程 ID 的 kill 命令。 這 kill 該命令有一些近親。 這 pkill 命令將按名稱終止進程,並且 killall 它會殺死所有它能找到的共享名稱部分的進程。

如果您對某個進程的了解只是它正在使用您計算機上的一個端口,那麼仍然有一些方法可以識別並終止它。 在網絡術語中,“端口”可以表示一個物理連接,末端帶有插頭的電纜插入其中,例如CAT5或6網線或者它可能意味著軟件端口。

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

這就像到達酒店的郵政郵件,然後分揀並投遞到相應的房間。 IP 地址就像旅館的街道地址,房間號就像端口號。

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

使用 socat 創建連接

為了讓我們有一些連接要殺死,我們將使用 socat 使用不同的協議創建網絡連接。 你必須安裝 socat . 安裝它Ubuntu,使用這個命令:

                      sudo apt install socat
                    

在 Fedora 中使用 dnf :

                      sudo dnf install socat
                    

Instalación de socat en Fedora

在 Manjaro 中你需要這樣寫:

                      sudo pacman -S socat
                    

Instalación de socat en Manjaro

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

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

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

Creación de una conexión de socket TCP de escucha con socat

我們將再創建兩個連接,以選擇一小部分使用不同協議的套接字。 我們將創建一個udp連接和一個sctp連接. 命令中唯一改變的部分是協議。

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

Creación de conexiones de socket UDP y SCTP de escucha con socat

TCP和UDP有什麼區別?

使用 kill

當然我們可以使用 kill 終止進程,只要我們知道進程 ID 是什麼。 要找到 PID,我們可以使用 lsof 領域。

要列出使用 TCP 協議的端口 7889 上的進程的詳細信息,我們使用 -i (互聯網地址)像這樣。

                      lsof -i tcp:7889
                    

Usando lsof para mostrar los detalles de un proceso usando un puerto y protocolo específico

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

                      sudo kill 3141
                    

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

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

Canalización de la salida de lsof en awk

然後我們可以通過管道輸出 awk 在裡面 kill 命令使用 xargs . 這 xargs 該命令獲取其管道輸入並將其作為命令行參數傳遞給另一個命令。 我們將使用 xargs kill 領域。

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

Uso de tuberías para llevar la salida de lsof a awk y de awk a xargs y matar

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

                      lsof -i tcp:7889
                    

Usar lsof para buscar detalles de un proceso usando un puerto y protocolo específicos sin éxito

因為 lsof 沒有報告任何東西,我們知道沒有這種聯繫。

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

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

Uso de tuberías para llevar la salida de lsof a awk y de awk a xargs y matar, para un socket UDP

儘管如此, lsof 它不識別 SCTP 協議。

                      lsof -i sctp:7889
                    

lsof no funciona con el protocolo SCTP

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

                      ss -Sap
                    

Imprimir los detalles de un proceso usando un socket SCTP con ss

我們可以使用解析該輸出 grep awk . 我們也可以使用解析它 grep 和一些 PERL 正則表達式,但這樣更容易理解。 如果您打算不止一次或兩次使用它,您可能會使用別名或 shell 函數。

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

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

Uso de tuberías para conectar ss, grep y awk para extraer la cadena PID

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

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

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

Uso de tuberías para conectar ss, grep y awk dos veces, para extraer el PID

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

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

Uso de canalizaciones con ss, grep, awk y xargs para finalizar un proceso de socket SCTP

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

熔化器命令

fuser 命令簡化了很多事情。 缺點是它只適用於 TCP 和 UDP 套接字。 從好的方面來說,這是您必須處理的兩種最常見的插頭類型。 這 fuser 該命令已經安裝在我們審查過的 Ubuntu、Fedo 和 Manjaro 計算機上。

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

                      fuser -n tcp 7889
                    
                      fuser 7889/udp
                    

Usando el comando fuser para eliminar los procesos usando sockets TCP y UDP

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

先測試定影器

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

相關文章