ポート占有状況の確認方法、各プラットフォーム
1. 背景
ポートの占有状況を確認するにはどうすればよいですか? オンラインには多数ありますが、そのほとんどは、コマンドの出力を表示する方法についての説明がなく、コマンドを直接吐き出します。
いわゆる「ポート占有チェック」とは、あるポートが、あるプログラムによって占有されているかどうか、占有されている場合にはどのプロセスによって占有されているかを確認することを意味する。PS: プロセスはプロセス ID によって識別されます。
2. コマンドの概要
対応プラットフォーム | 注文 | 効果 | 補充する |
---|---|---|---|
Linux | netstat -tunlp|grep 8080 | ポート 8080 を占有しているプロセス ID を表示する | MacOSでは使用できません。4 番目の列 (ローカル アドレス) を見て、ポート番号と完全に一致する行に対応する PID を確認します。このコマンド自体は、LISTEN がリッスンしていることを検出します(Linux では LISTEN と表示され、Windows では LISTENING と表示されます。これは同じ意味です)。 |
ウィンドウズ | netstat -ano|findstr 8080 | ポート8080が占有しているプロセスIDを確認する | findstr には findStr を使用することもできます。8080 には二重引用符 "8080" を使用することもできます。2 番目の列 (ローカル アドレス) を確認すると、ポート番号と正確に一致する行に対応する PID があり、ステータスが LISTENING であることがわかります。 |
MacOS/Linux | lsof -i:8080 | ポート8080が占有しているプロセスIDを確認する | これは MacOS で使用され、Linux でも使用できますが、Linux にはデフォルトでこのコマンドがない場合があるため、自分でインストールする必要があります。問題が発生した場合は、先頭に sudo を追加してみてください。sudo lsof -i:8080 このコマンドはポート 8080 と正確に一致し、18080 の占有は表示されません。 |
Linux の LISTEN 状態は Windows の LISTENING 状態であり、同じ意味で異なる言葉が使用されていることに注意してください。
3. コマンドの出力結果の詳細説明
3.1、Windows:netstat -ano|findstr 8080
ポート番号を確認したいポート番号に置き換えるだけです。
3.1.1. 返される結果は次のようになります。
非常に多くの列があり、意味は左から右に次のとおりです: プロトコル、ローカル アドレス、外部アドレス、ステータス、プロセス ID
出力ヘッダーを使用したことを思い出せませんnetstat -ano
(ヘッダーと値がわずかにずれていることに注意してください)
netstat -ano|findstr 8080
findstr (Linux の grep) の意味は、前の出力結果 (結果) から 8080 文字列を含む各行をフィルターで取り除き、結果を再構築することです。フィルタリング ルールは、%yourKeyword% の前後であいまい一致します。行内のどの列に 8080 文字列が含まれていても、フィルタリングされて除外されます。たとえば、ローカル アドレスまたは外部アドレスは、8080 が含まれているために一致する可能性があります。 。明らかに、ヘッダーには 8080 が含まれていないため、フィルターで除外されます。これが、フィルター後にヘッダーが表示されない理由です。ヘッダーをnetstat -ano|findstr 本地
フィルターで除外するには、 を使用します。
3.1.2 コマンド出力結果の解釈が正式に開始
何も出力されない場合、このポートを占有しているプロセスはありません。
占有されている場合は、少なくとも次の内容が入力されます。
場合によっては、もう少し複雑になって出力されます。
確認方法は? 8080 が非常に多く、プロセス ID が異なります。
- まず、2 番目の列を見てください。2 番目の列のポート 8080 を見てください。
- 最後に、LISTENING ステータスを確認します。
フィルタリングすると 2 つの項目が残ります。1 つは IPv4、もう 1 つは IPv6 で、どちらも同じです。12636 プロセスによって占有されていることを確認するメッセージが表示されます。
IPv4の書き込み方式:0.0.0.0:8080、IPv6の書き込み方式:[::]:8080
LISTENING ステータスが見つからない場合もありますが、それ以外のステータスは見つかりますが、この時点では実際にはポートが占有されていません。
この状況は、たとえば 8080 自体が起動され、アクセスされた痕跡が残り、8080 プロセスが強制終了された後、LISTENING ステータスはすぐに消えますが、他のステータスは一定期間キャッシュされるため発生します。一定期間テストして(どのくらいの期間かは数えませんでした)、もう一度チェックしましたが、何も見つかりませんでした。
3.1.3 その他の考えられる疑問点の説明
-
なぜ2行あるのでしょうか?
1 つの行は IPv4 用で、もう 1 つの行は IPv6 用です。2行ありますが、実際にはプロセスIDは同じであり、矛盾はありません。実は私も詳しい事がよく分からないので、もし詳しくご存知の方がいらっしゃいましたら、メッセージを頂ければ幸いです。
-
2 番目の列 (ローカル アドレス) を確認する必要があるのはなぜですか。なぜ 3 番目の列 (外部アドレス) ではなく 2 番目の列を確認する必要があるのですか。また、LISETNING ステータスを確認する必要があるのはなぜですか?
-
まず基本的な知識として、双方が接続したい場合、双方のプロセスには接続するためのアドレス (IP とポート番号) が必要であるため、アドレスは 2 つ存在します。
たとえば、ブラウザで Web サイトにアクセスすると、ローカル マシンには IP とポートが必要ないように見えますが、実際、ブラウザの開発者ツールを開くと、行われたすべてのリクエストにローカル IP アドレスが含まれていることがわかります。 。
-
一般的に、特定のポートが占有されているかどうかを確認したい場合、このポートは確認する前に常に占有されている必要があるため、LISTENING ステータスを確認する必要があります。LISTENING は永続的に占有されていることを意味するためです。聞いています。
-
ローカル アドレスは、特定のサービスが開始されて以来そのサービスによって占有されているポートであるため、リモート アドレスではなくローカル アドレスを確認する必要があります。リモート アドレスは、リモート接続する必要があるローカル マシンの IP とポートです。リモート アドレスについて心配する必要はありません。結局のところ、リモート アドレスはサーバーに接続する必要があります。通常、一時的なポート番号が使用され、使用後にリサイクルされます。
ストレス テストに jmeter を使用する場合、実際には基本的な知識があります。つまり、インターフェイスに同時にアクセスする 60,000 人を超えるユーザーをシミュレートする必要があり、単一のマシンでは不可能であるということです。たとえば、jmeter がマシン A にインストールされている場合、オペレーティング システムには最大 65536 のポート番号があるため、そのようなユーザーをマシン A で同時にシミュレートしたい場合は、非常に多くのスレッドをマシン A で開始する必要があります。 1 つのスレッドは 1 人のユーザーを表すため、各スレッドは 1 つのポートを占有します ポート番号はストレスがかかるサーバー上のインターフェイスと通信します マシン上の最大 65536 のポート番号が同時に使用されます。したがって、同時ストレス テストの数は、マシンは当然、最大ポート数によって制限されます。
-
2 番目の列
0.0.0.0:8080
は、0.0.0.0
制限されていないリモート ポート番号を示します。Redis 構成に精通している人は、バインド構成があることを知っています。0.0.0.0 は誰でも接続できることを意味し、127.0.0.1 はローカル接続のみが作成できることを意味します。このようにして、リモート接続の IP アドレスを制限できます。より安全です。ここでも同じ意味
-
3.2. Linux (一部の原則は Windows と同じです。よくわからない場合は Windows を読むことをお勧めします)
このコマンドを使用して、netstat -tunlp|grep 8080
tunlp、tun+lp、および Wife を記憶します。。。最終的な出力列の順序はこれらの文字とは関係がありません。たとえば、netstat -tunpl|grep 8080
出力によって列の位置は変更されません。
このコマンドのパラメーターは LISTEN ステータス (つまり、リスニング) のみを検出するためl
、リスニング ステータスを手動でフィルターする必要はありません。列 4 のアドレス (ローカル アドレス) を確認するだけで済みます。この列は完全に一致する可能性があります。確認したいポート番号を使用するだけで、一致する行の PID が探しているものになります。
同様に、テーブルのヘッダーがわからない場合は、コマンドで grep 部分を削除して確認するとnetstat -tunlp
、Proto、Recv-Q、Send-Q、Local Address、Foreign Address、状態、PID/プログラム名
(TODO: 追加のスクリーンショット)
3.3、MacOS
3.3.1. 使用方法lsof -i:8080
ポート 8080 を占有しているプログラムを確認し、必要に応じて sudo などを追加できますsudo lsof -i:8080
。
結果の解釈
-
出力結果は以下のようになります。複数ありますが、LISTENの状態によって異なります。
-
このコマンドのポート パラメータは完全一致です。つまり、8080 と完全に一致しますが、ポート 18080 の占有とは一致しません。実験を行って検証しました。
下図に示すように、ポートが占有されていない場合は何もありません。
次の図に示すように、出力結果はあるが、LISTEN ステータスがない場合 (矢印括弧を参照)、それを占有するプログラムはありません。
(LISTEN ステータスがないのはなぜですか? これは、以前のキャッシュが原因である可能性があります。ポート 8080 上のプログラムがアクセスされたばかりで、ポート 8080 上のプログラムがすぐに強制終了された場合、LISTEN ステータスはすぐにはありませんが、ポート8080にアクセスしたプログラム キャッシュが少し残っており、しばらくしてから再度確認すると以下の情報が消えていることがわかります)
下図のように、LISTEN 状態の項目が 1 つある場合、PID を確認することで占有しているプログラムを見つけることができます。
lsof -i:8080
上で見つけた 8080 が 18080 ではないことをどうやって証明できますか? 8080 と 18080 で 2 つの Web プログラムを同時に起動しましたが、lsof -i:8080
表示された結果はポート 18080 の結果と混ざらず、lsof -i:18080
実際に占有しているプログラムを正しく見つけることができました。
3.3.2 netstat コマンドを使用する (このコマンドは明らかに機能しないようです)
このコマンドはMacOS でも使用できますnetstat
が、macOS では BSD ベースのネットワーク ツールを使用しているため、netstat
コマンドのパラメータや出力形式が Linux とは若干異なる場合がありますので、パラメータが Linux のものと同じではありません。
使用するコマンドは です netstat -an|grep 8080
が、残念ながらこのコマンドはPIDカラムを出力できませんnetstat --help
ヘルプドキュメントを確認したところ、サポートするパラメータがないようなので、当面解決策はありません Netstatを使用してポート占有を確認することはできませんマックOS。何かご存知の場合は、コメント欄に追加してください。
4. 補足:
netstat の使用方法については、Linux/Windows で次のオプションの文字の意味を一覧表示するために使用できます。Windows ではデフォルトで中国語が出力されます。最初にコマンドを実行し、英語に切り替えてからコマンドのヘルプを確認することnetstat --help
もできます。chcp 437
。
- Windows の中国語版と英語版
中国語版は以下の通り
- Linux
(TODOは追加予定)
-
マックOS
-
lsof コマンド
-
netstatコマンド
次のコマンドは使用法を要求するもので、不正なオプションを要求するようですが、おそらく
netstat --help
macOS 用のコマンドを表示する方法ではなく、間違ったコマンドを使用しているため正しい使用法が要求されるだけでしょうか?いずれの場合も使用方法がヒントになっているので、長々と説明したくない場合は、 を使用して
man nestat
コマンドの使用方法を確認することもできます。
-