ポートがすでに開いているかどうかを通知するbashから実行できるコマンドはありますか?
「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/named
これ(netstat)は最速のソリューションです...
netstat -lnt
...しかし、これはより多くの制御を提供します(速度を犠牲にして(時には速度を大幅に))...
lsof -n -i -a -u www-data
上記の例は、すべてのTCPポートが開いており、LISTEN
状態で、かつ(-a
)Apache(www-data
)ユーザー。
試す
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
t
isteningであるl
cpポートを表示し、n
umbersのみを表示し(名前を解決しない-高速化)、実行中のp
rocessを表示しますリスニング(p
はrootである場合にのみ機能します)
netstat -ulnp
u
istingであるl
dpポートを表示し、n
umbersのみを表示し(名前を解決しない-高速化)、実行中のp
rocessを表示しますリスニング(p
はrootである場合にのみ機能します)
netstat -unp
開いているがリッスンしていないu
dpポートを表示し、n
umbersのみを表示し(名前を解決しない-高速化)、リスニングを実行しているp
rocessを表示します( p
はrootである場合にのみ機能します)
netstat -an
使用中のa
llポートを表示し、n
umbersのみを表示-名前を解決しない
lsof -i <proto>@<Host>:<port>
例えば
lsof -i tcp@localhost:25
ポートlocalhost 25/TCPで待機しているものがあるかどうかを確認する、または
lsof -i [email protected]:636
ローカルまたはリモートのいずれかのソケットが存在するかどうかを確認するために、任意のホスト/インターフェースをリスニング(ローカル)または接続(ローカルまたはリモート)します。
lsof(開いているファイルのリスト)は、プロセスがポートで待機しているかどうかを確認するのに適したツールです
lsof -P | grep:<ポート番号>
netstatは、アクティブな接続があるかどうかを確認するのに適したツールです。
netstat -n | grep:<ポート番号>
fuserを使用します(psmiscパッケージ内):
fuser -n tcp PORT
このポートにバインドされているプロセスのpidを戻します。
これがポートがリッスンしているかどうかを知る場合、古き良きtelnetがトリックを行います:)
telnet 127.0.0.1 PORT
使用するプロトコル、つまりTCPまたはUDP-)については言及していません。また、「ポート」は、システムがソケットを明確にするためにサポートしているほど細かくないことを認識することも重要です。システムに複数のIPアドレスがある場合、ポート80がすべてのIPアドレスで使用されているか(アプリケーションが「0.0.0.0」または「::」にバインドされているか、各IPアドレスに連続してバインドされている)、または使用されている可能性があります。それらのIPアドレスのサブセットでのみ。
ポート/アドレスが空いていて利用可能かどうかを判断する最善かつ確実な方法は、それにバインドすることです。これにはNetcatが便利です。
nc -l [-s a.b.c.d] -p NN
TCPポートNNにバインドしようとします(オプション、デフォルトはすべてのアドレスになります)a.b.c.d. -uオプションを追加して、UDPで同じことを行います。
次に、要求どおりにポートが本当に「開いている」かどうかを確認するには、潜在的なファイアウォールルールの調査を開始する必要があります。繰り返しますが、最も簡単な方法は、ポートに接続することです。上記のようにサーバー上でnetcatを使用し、クライアントからnetcatを使用して、開いたポートへの接続を試みます。
nc [-u] a.b.c.d NN
-uフラグが指定されている場合、UDPを使用してa.b.c.dのポートNNに接続します。次に、クライアントエンドに入力を入力すると、サーバーに表示されます。そうでない場合は、システムおよびネットワーク固有のツールを調べる必要があります。
このワンライナーは、使用中のすべてのTCP=ポートのリストを取得します。UbuntuおよびOS Xのbashで動作します。
netstat -ant | sed -e '/^tcp/ !d' -e 's/^[^ ]* *[^ ]* *[^ ]* *.*[\.:]\([0-9]*\) .*$/\1/' | sort -g | uniq
リストには、追加情報なしで1行に1つのポートがあります。
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
これまでのところ、かなりうまく機能しています。