ポート番号でLinuxプロセスを終了する方法



Linuxマシンで特定のプロセスがポートを占有していて、それを削除したいと思ったことはありませんか?アプリがフリーズしたのかもしれませんし、ネットワークリソースを不正に使用している何かが心配なのかもしれません。理由が何であれ、そのプロセスを見つけて終了させる方法を知っていれば、多くの悩みを解消できます。幸いなことに、Linuxにはfuserlsofnetstatといった便利なコマンドが用意されており、コマンドラインのちょっとしたテクニックを使えば、特定のポートを使用しているプロセスを特定してシャットダウンすることができます。

確かに、ターミナルでの作業に慣れていないと、最初は少し戸惑うかもしれません。しかし、これらのツールに慣れれば、ネットワークの問題のトラブルシューティング、動作不良のアプリの停止、さらには潜在的なセキュリティ脅威の排除まで、かなり迅速に実行できるようになります。ただし、kill -9でプロセスを強制終了することは必ずしも安全とは限らず、注意しないとデータが失われる可能性があるので注意してください。

fuserコマンドを使ってLinuxプロセスを強制終了する方法

方法1: 使用fuser

おそらくこれが一番簡単な方法でしょう。このfuserコマンドは、特定のポートやリソースにアクセスしているプロセスを表示します。ポート番号だけがわかっていて、誰がそこにアクセスしているのかを確認したい場合に非常に便利です。

なぜ役立つのか? ポートに関連付けられたプロセスID(PID)を一覧表示してくれるので、ポートを探す手間が省けます。どのような場合に使えるのか? 通常、ポートがスタックしているように見える場合や、「ポートが既に使用中」という競合が発生している場合に使います。 期待される効果? 実行するとfuserPIDが表示され、追加すると-kそれらのプロセスが強制終了されます。

一般的な構文は次のとおりです。

fuser -n tcp 80

tcp必要にudp応じて を、80ターゲットポートに置き換えてください。これにより、TCPポート80を使用しているプロセスが一覧表示されます。これらのプロセスを強制終了するには、以下を追加します-k

sudo fuser -k -n tcp 80

スーパーユーザーとして実行することがしばしば必要になります。特に、プロセスの所有者でない場合はなおさらです。設定によっては、スーパーユーザーとして実行しないと、sudoすべてのプロセスがリスト表示または強制終了されない場合があります。

注意:-KILLの代わりに を使用すると-k、SIGKILL が送信され、クリーンアップ処理なしでプロセスが強制終了します。この方法はうまくいく場合もありますが、データ損失が発生する可能性があるので注意してください。SIGTERM で問題が解決しない場合にのみ使用してください。例:

sudo fuser -KILL -n tcp 80

方法2: 使用lsof

もう一つの方法は、特にポートを占有しているものの詳細を知りたい場合に便利なlsofコマンドです。このコマンドは開いているファイルを表示します。Linuxの世界では、ネットワークソケットはファイルです。

なぜこれを選ぶのか?それは、PIDと接続方法に関する情報を含むプロセスの一覧を簡単に取得したい場合です。いつ使うのか?通常は、fuserが利用できない場合や、より詳しい情報が必要な場合です。基本的なコマンドは以下のとおりです。

lsof -i tcp:80

これは、TCP ポート 80 を介してリッスンまたは接続しているプロセスを表示します。PID のみを取得するには、次のようにします。

kill $(lsof -t -i tcp:80)

一部のプロセスが通常のシグナルでシャットダウンを拒否する場合は、次のコマンドで強制終了できます-9

kill -9 $(lsof -t -i tcp:80)

注意:強制終了は、重要な処理を実行しているプロセスの場合、問題を引き起こす可能性があります。慎重に使用してください。

方法3: 使用netstat

これは少し古いですが、多くの場合まだ役に立ちます。netstat適切なフラグを使用すると、アクティブなネットワーク接続とリスニング ソケット、および PID が表示されます。

なぜわざわざそんなことをするのでしょうか?特定のポートで何が待機しているのかを確認したい場合、おそらくそれを強制終了する前に確認したい場合です。いつ確認するのでしょうか?システムのポートが占有されているようで、何が原因か分からない場合です。コマンドは次のようになります。

sudo netstat -p tcp -l -n

これは、プロセス情報を含む待機中のTCPソケットを一覧表示します。80のような特定のポート番号でフィルタリングするには、ポート番号で直接フィルタリングできないgrepため、などの他のツールと組み合わせる必要があるかもしれません。netstat

sudo netstat -p tcp -l -n | grep :80

出力から PID をメモし、次のコマンドで強制終了します。

sudo kill 1234

または、強制的に停止するには:

sudo kill -9 1234

注: netstat は多くの場合、すべてのプロセス情報を表示するために root 権限を必要とするため、これらのコマンドのほとんどにはsudo が必要です。また、PID を直接終了すると、注意しないと無関係なプロセスも終了してしまう可能性があるため、コマンドを実行する前に必ず確認してください。

Linuxアプリケーションを制御する

全体的に見て、これらのコマンドは特定のネットワークポートでスタックしているプロセスを強制終了するための非常に優れたツールキットです。ただし、強制終了はkill -9状況が悪化したり、データが破損したりする可能性があるため、注意が必要です。不明な場合は、まずより穏やかなSIGTERMコマンドを試してください。

セキュリティが心配な方は、ポートに誰が、あるいは何が潜んでいるかを確認するのに良い方法です。あるいは、誤って起動した不正なプロセスを強制終了させるのも良いでしょう。ある設定では最初はうまくいきましたが、別の設定ではうまくいきませんでした。Linuxのランダム性こそが、物事を面白くしてくれるのです。

もちろん、Linux では、必要以上に難しくしなければならないこともあります。

まとめ

  • fuser -n tcp/udp [port]ポート上のプロセスを検索して終了するために使用します。
  • プロセスをlsof -i tcp:port識別して使用します。kill
  • アクティブなリスニング ソケットを表示し、PID を取得するために使用しますnetstat -p tcp -l -n
  • 強制終了には注意してください。特に-9、; を使用すると、データの損失や不安定化が発生する可能性があります。

まとめ

最初は面倒に感じるかもしれませんが、慣れれば問題のあるプロセスをシャットダウンするのは当たり前のようになります。ただし、強制終了するプロセスは必ず二重チェックしてください。重要なシステムサービスを誤ってクラッシュさせてしまうような事態は避けたいものです。この方法が、厄介なポートの競合を解決し、Linuxマシンをスムーズに動作させるのに役立つことを願っています。



この記事は役に立ちましたか?