ウェブサイト検索

Linuxでポート番号に基づいてプロセスを終了する方法


任意の瞬間に、あなたのLinuxシステムは同時に複数のプロセスを実行しています。これらのプロセスのいくつかは、データのアップロードやダウンロードが行われている場合、ネットワークへのアクセス権を持っています。これらのプロセスは通常、特定のポート番号にバインドされており、ポート番号に基づいてプロセスを終了させることができます。

killコマンドは、システム管理者がプロセスの実行を停止させる方法の一つです。しかし、killコマンドはプロセスIDのみを引数として受け付けます。pkillとkillallコマンドはさらに2つの選択肢ですが、これらはプロセス名を引数として受け入れます。

ポート番号に基づいてプロセスを終了させるためには、fuserコマンドを使用するか、通常のkillコマンドと組み合わせて他のコマンドラインツールを使用する必要があります。このチュートリアルでは、Linuxにおいてポート番号に基づいてプロセスを終了させる複数の方法を示します。

このチュートリアルでは、あなたは学びます:

  • TCPまたはUDPポートでfuserを使ってプロセスを終了させる方法
  • SCTPポートでプロセスをkillを使って終了させる方法
  • ssとlsofを使ってポートがどのプロセスを使用しているかを確認する方法
  • socatを使用してテスト目的でプロセスをポートにバインドする方法

特定のポートを使用しているプロセスを確認する方法

前述したように、incoming接続を待機するプロセスはポートにバインドされます。ほとんどのプロセスは、デフォルトのポート以外を使用するように設定されていない限り、常に同じポートを使用します。例えば、SSHはポート22を使用し、HTTPはポート80を使用し、MySQLはポート3306を使用します。この知識をもって、サービスがどのポートで動作しているかを特定することができます。

lsofコマンド

システムで使用されているポートのリストを見るには、lsof コマンドが便利です。例えば、次のコマンドは、TCPポート80を利用しているプロセスの情報をリストします。


sudo lsof -i TCP:80

他の情報とともに、lsofコマンドは指定されたポートを利用しているプロセスのプロセスIDを教えてくれます。また、UDPポートでも動作します。lsofの使用方法についての詳細は、例を使用したlsof Linuxコマンドのガイドに関するチュートリアルをチェックしてください。

ssコマンド

特定のポートを使用しているプロセスを確認するために使用できる別のコマンドは、ssコマンドです。一部のユーザーは、lsofの代わりにssを好むかもしれませんが、個人的にはこの状況ではlsofの方が使いやすいと考えています。しかし、ssはSCTPポートなど、他のプロトコルを使用しているプロセスを一覧表示することができます。


ss -Slp

上記のコマンドの出力は、SCTPを使用しているすべてのプロセスとポートを表示します。ssの使い方についての詳細は、Linuxでのssコマンドの使用に関するチュートリアルをご覧ください。

これらの2つのツールを使用することで、特定のポートで実行されているプロセスIDを特定するのに役立ち、次のいくつかの例でそのプロセスIDをkillコマンドに渡す際にも便利です。

socatを使用してプロセスをポートにバインドする

以下のコマンドのテストを容易にするために、socat コマンドを使用して、任意のポートに自分自身をバインドするダミープロセスを作成できます。

  1. TCPポート8080にプロセスをバインドする:

    
    socat tcp-listen:8080,bind=127.0.0.1 stdout &
    
  2. UDPポート8080にプロセスをバインドする:

    
    socat udp-listen:8080,bind=127.0.0.1 stdout &
    
  3. ポート8080にSCTPプロセスをバインドする:

    
    socat sctp-listen:8080,bind=127.0.0.1 stdout &
    

これらの例はあなたのプロセスをバックグラウンドに移します。次に、以下のコマンドを使用してプロセスを終了するテストを行うことができます。

ポート番号に基づいてプロセスを終了する例

  1. TCPまたはUDPポートでリッスンしているプロセスに対して、fuserコマンドと-k(kill)オプションを使用すると、関連するプロセスを終了させることができます。コマンドにポートの種類(TCPまたはUDP)とポート番号を指定するだけで済みます。例えば、これによりTCPポート80を使用しているプロセスが終了します。

    
    fuser -k 8080/tcp
    
  2. または、fuserを使用してUDPポート8080のプロセスを終了するには:

    
    fuser -k 8080/udp
    

    ポートを使用しているプロセスがないことを確認するために、その後に lsof コマンドを使用することを忘れないでください。

  3. fuserを使用したくない場合、lsofコマンドを使用してポート番号を利用しているプロセスIDを見つけ、そのデータをkillコマンドに渡すことができます。例えば、これはTCPポート8080を使用しているすべてのプロセスを終了します。

    
    lsof -i tcp:8080 | awk '/8080/{print $2}' | xargs kill
    
  4. SCTPなどの異なるプロトコルを使用してプロセスを終了するには、ssコマンドを使用し、PIDをxargsおよびkillコマンドにパイプします。たとえば、次のコマンドはSCTPポート8080を使用しているすべてのプロセスを終了します。

    
    ss -Slp | grep -Po ':8080\s.*pid=\K\d+(?=,)' | xargs kill
    

締めくくりの考え

このチュートリアルでは、Linuxシステム上で使用しているポート番号に基づいてプロセスを終了させる方法を見てきました。fuser コマンドはこの作業に使用する主なツールですが、Linuxはタスクを達成するために複数の方法をユーザーに提供することで知られています。代替手段として、lsof と ss コマンドは必要な情報を確認するのに役立ち、kill コマンドと組み合わせることで fuser と同じ効果を得ることができます。

関連記事: