ポート番号で 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を使用します。

 sudo dnf install socat 

Fedora に socat をインストールする

Manjaro では、次のように入力する必要があります。

 sudo pacman -S socat 

マンジャロにsocatをインストールする

socatの構文は、少し長くなりましたが、簡単です。 送信元アドレスと宛先アドレスを提供する必要があります。 これらのそれぞれについて、プロトコル、IP アドレス、およびポート番号を提供する必要があります。 ソースまたは宛先として STDIN または STDOUT を置き換えることができます。

このコマンドは、ポート 7889、ループバック IP アドレス 127.0.0.1、および STDOUT 上の TCP リスニング ソケット間の接続を作成します。 アンパサンド「 & 」はコマンドをバックグラウンドで実行するため、コマンド ラインへのアクセスを維持できます。

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

socat を使用したリッスン TCP ソケット接続の作成

異なるプロトコルを使用する少数のソケットを選択できるように、さらに 2 つの接続を作成します。 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 ソケット接続を作成する

関連: TCP と UDP の違いは何ですか?

キルの使用

もちろん、プロセスの ID がわかっていれば、 killを使用してプロセスを終了できます。 PID を見つけるには、 lsofコマンドを使用できます。

TCP プロトコルを使用しているポート 7889 のプロセスの詳細を一覧表示するには、次のように-i (インターネット アドレス) オプションを使用します。

 lsof -i tcp:7889 

lsof を使用して、特定のポートとプロトコルを使用するプロセスの詳細を表示する

このプロセスの PID は 3141 で、これをkillで使用できます。

 sudo kill 3141

パイプを使えば、いくらか手間を省くことができます。 lsofの出力をawkにパイプし、目的のポート (7889) を含む行を検索し、その行の 2 番目のフィールドを出力するようにawkに指示すると、PID が分離されます。

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

lsof の出力を awk にパイプする

次に、 xargsを使用して、 awkからの出力をkillコマンドにパイプできます。 xargsコマンドは、パイプされた入力を受け取り、それをコマンド ライン パラメーターとして別のコマンドに渡します。 killコマンドでxargsを使用します。

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

パイプを使用して、lsof の出力を awk に取り込み、awk から xargs に取り込んで kill する

視覚的なフィードバックはありません。 典型的な Linux のやり方では、良いニュースはありません。 プロセスが終了したことを確認したい場合は、もう一度lsofを使用できます。

 lsof -i tcp:7889 

lsof を使用して、特定のポートとプロトコルを使用して成功せずにプロセスの詳細を検索する

lsofは何も報告しないので、そのような関係がないことがわかります。

前のコマンドで「tcp」を「udp」に置き換えるだけで、UDP プロトコルを使用するプロセスを削除できます。

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

UDP ソケットの場合、パイプを使用して lsof の出力を awk に取り込み、awk から xargs に取り込み、kill する

ただし、 lsofは SCTP プロトコルを認識しません。

 lsof -i sctp:7889 

lsof は SCTP プロトコルでは機能しません

ssコマンドを使用してそれを行うことができます。 -S (SCTP) オプションを使用して SCTP ソケットを検索し、 -a (all) オプションを使用してすべてのタイプのソケット (リッスン、受け入れ、接続など) を検索し、 -p (プロセス) オプションを使用しています。ソケットを使用したプロセスの詳細を一覧表示します。

 ss -樹液

ss で SCTP ソケットを使用してプロセスの詳細を出力する

grepawkを使用してその出力を解析できます。 grepと一部の PERL 正規表現を使用して解析することもできますが、この方法の方がはるかに理解しやすいです。 これを 1 回か 2 回以上使用する場合は、エイリアスまたはシェル関数を作成することになるでしょう。

ssからの出力をgrepにパイプし、ポート番号 7889 を検索しますgrepからの出力をawkにパイプします。 awkでは、 -F (区切り文字列) オプションを使用して、フィールド区切り文字としてカンマ「 , 」を設定しています。 「pid=」を含む文字列を検索し、その文字列から 2 番目のコンマ区切りフィールドを出力します。

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

パイプを使用して ss、grep、および awk を接続し、PID 文字列を抽出する

これにより、文字列「pid=2859」が得られました。

これを再度awkにパイプし、フィールド区切り文字を等号「 = 」に設定して、その文字列から 2 番目のフィールドを出力します。これは等号の後ろのテキストになります。

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

パイプを使用して ss、grep、および awk を 2 回接続し、PID を抽出します。

これで、プロセス ID が分離されました。 xargsを使用して、PID をコマンド ライン パラメータとしてkillに渡すことができます。

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

ss、grep、awk、および xargs でパイプを使用して SCTP ソケット プロセスを終了する

これにより、ポート 7889 で SCTP プロトコル ソケットを使用していたプロセスが強制終了されます。

定着コマンド

fuserコマンドを使用すると、作業が大幅に簡素化されます。 欠点は、TCP および UDP ソケットでしか機能しないことです。 プラス面としては、対処する必要がある最も一般的な 2 つのタイプのソケットです。 fuserコマンドは、チェックした Ubuntu、Fedora、および Manjaro コンピューターに既にインストールされていました。

-k (kill) オプションを使用して、ポートとプロトコルを指定するだけです。 -n (名前空間) オプションを使用してプロトコルとポートを指定するか、「スラッシュ ショートカット形式」を使用してポート番号を最初に指定することができます。

 フューザー -n tcp 7889
 定着器 7889/udp 

fuser コマンドを使用して、TCP および UDP ソケットを使用してプロセスを削除する

終了したプロセスのポート番号、プロトコル、および PID がターミナル ウィンドウに出力されます。

最初に定着器を試す

おそらく作業中のコンピューターにインストールされ、プロトコルはTCPまたはUDPである可能性が高いため、最も簡単な方法でうまくいく可能性が高くなります.