回答:
「netstat」を使用して、現在使用しているポートを確認します。
netstat -antp Proto Recv-Q Send-Qローカルアドレス外部アドレス状態PID /プログラム名 tcp 0 0 xxx.xxx.xxx.xxx 0.0.0.0:* LISTEN 16297 / named tcp 0 0 xxx.xxx.xxx.xxx:53 0.0.0.0:* LISTEN 16297 / named tcp 0 0 xxx.xxx.xxx.xxx:53 0.0.0.0:* LISTEN 16297 / named tcp 0 0 127.0.0.1:53 0.0.0.0:* LISTEN 16297 /名前付き
試して
lsof -i :<port number>
結果が得られた場合、何かがリスニングされバインドされています。例えば
# lsof -i :80
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
nginx 1833 nobody 3u IPv4 51091229 0t0 TCP odessa.cheney.net:http->79.173.188.214:52918 (ESTABLISHED)
nginx 1833 nobody 5u IPv4 46221856 0t0 TCP odessa.cheney.net:http->66.36.243.182:37876 (CLOSE_WAIT)
nginx 1833 nobody 9u IPv4 34733048 0t0 TCP localhost.localdomain:http (LISTEN)
nginx 1833 nobody 10u IPv4 34733049 0t0 TCP odessa.cheney.net:http (LISTEN)
nginx 1833 nobody 14u IPv4 46221857 0t0 TCP odessa.cheney.net:http->66.36.243.182:37880 (CLOSE_WAIT)
nginx 1833 nobody 15u IPv4 51091030 0t0 TCP odessa.cheney.net:http->msnbot-65-55-106-132.search.msn.com:51708 (ESTABLISHED)
nginx 11832 root 9u IPv4 34733048 0t0 TCP localhost.localdomain:http (LISTEN)
nginx 11832 root 10u IPv4 34733049 0t0 TCP odessa.cheney.net:http (LISTEN)
netstat -tlnp
isteningのt
cpポートを表示しl
、n
umbersのみを表示し(名前を解決しない-高速にします)、p
listenを実行しているプロセスを表示しp
ます(rootの場合のみ機能します)
netstat -ulnp
isteningのu
dpポートを表示しl
、n
umbersのみを表示し(名前を解決しない-高速になります)、p
listenを実行しているプロセスを表示しp
ます(rootの場合のみ機能します)
netstat -unp
u
開いているがリッスンしていないn
DP ポートを表示し、アンバーのみを表示し(名前を解決しないでください-高速になります)、p
リッスンしているプロセスを表示しp
ます(ルートの場合のみ機能します)
netstat -an
a
使用中のllポートを表示、n
umbersのみを表示-名前を解決しない
lsof -i <proto>@<host>:<port>
例えば
lsof -i tcp@localhost:25
ポートlocalhost 25 / TCPでリッスンしているかどうかを確認する、または
lsof -i tcp@0.0.0.0:636
ホスト/インターフェースをリッスン(ローカル)または接続(ローカルまたはリモート)しているローカルまたはリモートのソケットがあるかどうかを確認する
使用するプロトコル、つまりTCPまたはUDPについては言及しません。また、「ポート」は、システムがソケットを明確にするためにサポートするほど細かくはないことを認識することも重要です。たとえば、システムに複数のIPアドレスがある場合、ポート80はすべてのIPアドレスで使用されている可能性があります(アプリケーションが「0.0.0.0」または「::」にバインドされているか、各IPアドレスに連続してバインドされている)、またはこれらのIPアドレスのサブセットでのみ使用してください。
ポート/アドレスが空いていて利用可能かどうかを判断する最善かつ確実な方法は、ポート/アドレスにバインドすることです。Netcatはこれに便利です。
nc -l [-s abcd] -p NN
TCPポートNNにバインドしようとします(オプション、デフォルトはすべてのアドレスになります)abcd UDPで同じことを行うには、-uオプションを追加します。
次に、ポートが本当に「開いている」かどうかを確認するために、潜在的なファイアウォールルールを確認する必要があります。繰り返しますが、最も簡単なことは、ポートへの接続を試みることです。上記のようにサーバー上でnetcatを使用し、クライアントからnetcatを使用して、開いたポートへの接続を試みます。
nc [-u] abcd NN
-uフラグが指定されている場合、UDPを使用して、abcdのポートNNに接続します。その後、クライアントエンドに入力を入力すると、サーバーに入力が表示されます。そうでない場合は、システムおよびネットワーク固有のツールを調べる必要があります。
このワンライナーは、使用中のすべてのTCPポートのリストを取得します。UbuntuおよびOS Xのbashで動作します。
netstat -ant | sed -e '/^tcp/ !d' -e 's/^[^ ]* *[^ ]* *[^ ]* *.*[\.:]\([0-9]*\) .*$/\1/' | sort -g | uniq
リストには、追加情報なしで1行に1つのポートがあります。
for port in $(netstat -ant | sed -e '/^tcp/ !d' -e 's/^[^ ]* *[^ ]* *[^ ]* *.*[\.:]\([0-9]*\) .*$/\1/' | sort -g | uniq); do echo EXECUTE COMMAND FOR PORT $port; done
Linuxやosxで動作しなかったり、Dockerが使用するポートやルートが所有するプロセスが表示されなかったりするため、多くの方法で問題が発生しました。今、私はこのjavascriptプログラムを使用しています:
(ノードがインストールされていることを確認し、それが機能するnode
だけでなくnodejs
、それに応じてプログラムを変更する)
check-port
パスまたはプロジェクトで呼び出されるファイルに以下を保存します
#!/usr/bin/env node
var http = require('http');
var app = new http.Server();
app.listen(process.argv[2], () => {
process.exit(0)
});
許可を設定する
chmod +x path/to/check-port
あなたの道から走る
check-port 8080
または同じディレクトリから実行する
./check-port 8080
これまでのところ、かなりうまく機能しています。