如何通過端口號殺死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
在 Manjaro 上,您需要輸入:
sudo pacman -S socat
語法socat
很簡單,雖然有點冗長。我們需要指定源地址和目標地址。對於它們中的每一個,我們需要指定協議、IP 地址和端口號。我們可以將 STDIN 或 STDOUT 替換為源或目標。
此命令在端口 7889 上的 TCP 偵聽套接字、環回 IP 地址 127.0.0.1 和 STDOUT 之間創建連接。與號“ &
”在後台運行命令,因此我們保留對命令行的訪問權限。
socat tcp-listen:7889,bind=127.0.0.1 stdout &
我們將再創建兩個連接,以便我們有少量使用不同協議的套接字。我們將創建一個 UDP連接和一個SCTP連接。命令中唯一改變的部分是協議。
socat udp-listen:7889,bind=127.0.0.1 stdout &
socat sctp-listen:9999,bind=127.0.0.1 stdout &
使用暗殺
當然kill
,如果我們知道進程 ID,我們可以使用它來終止進程。要查找 PID,我們可以使用 lsof
命令。
要列出使用 TCP 協議的端口 7889 上的進程的詳細信息,我們使用-i
(internet address) 選項,如下所示。
lsof -i tcp:7889
此進程的 PID 為 3141,我們可以將其用於kill
:
sudo kill 3141
如果我們使用管道,我們可以節省一些精力。如果我們將輸出定向lsof
到awk
命令awk
以查找包含我們感興趣的端口的行 – 7889 – 並從該行打印第二個字段,我們將隔離 PID。
lsof -i tcp:7889 | awk '/7889/{print $2}'
然後我們可以使用管道將輸出awk
傳遞kill
給命令xargs
。命令xargs
通過管道獲取輸入並將其作為命令行參數傳遞給另一個命令。我們將xargs
與kill
團隊一起使用。
lsof -i tcp:7889 | awk '/7889/{print $2}' | xargs kill
我們沒有得到任何視覺反饋。在典型的 Linux 時尚中,沒有消息就是好消息。如果您想確保該過程已完成,您可以lsof
再次使用。
lsof -i tcp:7889
由於lsof
它沒有報告任何內容,因此我們知道沒有這種聯繫。
我們可以通過簡單地將前面命令中的“tcp”替換為“udp”來刪除使用 UDP 協議的進程。
lsof -i udp:7889 | awk '/7889/{print $2}' | xargs kill
但是,lsof
它不識別 SCTP 協議。
lsof -i sctp:7889
我們可以使用ss
命令來做到這一點。我們使用-S
(SCTP) 選項搜索 SCTP 套接字,使用-a
(all) 選項搜索所有類型的套接字(偵聽、接收、連接等),使用-p
(processes) 選項列出有關進程的信息插座。
ss -Sap
我們可以使用grep
and解析這個輸出awk
。我們也可以用grep
一些 PERL 正則表達式來解析它,但是這種方式更容易理解。如果您要使用它不止一次或兩次,您可能會將其設為別名或 shell 函數。
我們將從ss
to 發送輸出grep
並找到我們的端口號 7889。我們將從grep
to發送輸出awk
。在awk
中,我們使用-F
(分隔符字符串)選項設置逗號“ ,
”作為字段分隔符。我們查找包含“pid=”的行並從該行打印第二個逗號分隔的字段。
ss -Sap | grep "7889"| awk -F',' '/pid=/{print $2}'
這給了我們字符串“pid=2859”。
我們可以awk
再次傳入,將字段分隔符設置為等號“ =
”,然後打印該行的第二個字段,這將是等號後面的文本。
ss -Sap | grep "7889"| awk -F',' '/pid=/{print $2}' | awk -F'=' '{print $2}'
我們現在已經隔離了進程 ID。我們可以使用 PID 作為命令行參數xargs
來傳遞。kill
ss -Sap | grep "7889"| awk -F',' '/pid=/{print $2}' | awk -F'=' '{print $2}' | xargs kill
這會殺死在端口 7889 上使用 SCTP 協議套接字的進程。
定影團隊
該命令fuser
大大簡化了工作。缺點是它只適用於 TCP 和 UDP 套接字。從好的方面來說,這是您需要處理的兩種最常見的套接字類型。該命令fuser
已經安裝在我們測試的 Ubuntu、Fedora 和 Manjaro 機器上。
您所要做的就是使用-k
(kill) 選項並指定端口和協議。您可以使用-n
(namespace) 選項並指定協議和端口,或者使用“斜線標籤格式”並首先指定端口號。
fuser -n tcp 7889
fuser 7889/udp
已完成進程的端口號、協議和 PID 打印在終端窗口中。
先試試熱熔器
它很可能會安裝在您正在使用的計算機上,並且協議很可能是 TCP 或 UDP,因此最簡單的方法很可能適合您。
發佈留言