ポートを使用している実行中のプロセスを見つけるには、いくつかの方法があります。
fuser を使用すると、リスニング ポートに関連付けられた複数のインスタンスの PID が得られます。
sudo apt-get install psmisc
sudo fuser 80/tcp
80/tcp: 1858 1867 1868 1869 1871
見つけた後、プロセスを停止または強制終了できます。
lsof を使用して PID と詳細を見つけることもできます
sudo lsof -i tcp:80
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
nginx 1858 root 6u IPv4 5043 0t0 TCP ruir.mxxx.com:http (LISTEN)
nginx 1867 www-data 6u IPv4 5043 0t0 TCP ruir.mxxx.com:http (LISTEN)
nginx 1868 www-data 6u IPv4 5043 0t0 TCP ruir.mxxx.com:http (LISTEN)
nginx 1869 www-data 6u IPv4 5043 0t0 TCP ruir.mxxx.com:http (LISTEN)
nginx 1871 www-data 6u IPv4 5043 0t0 TCP ruir.mxxx.com:http (LISTEN)
リッスンするソケットに限定するには ポート 80 で (ポート 80 に接続するクライアントとは対照的に):
sudo lsof -i tcp:80 -s tcp:listen
それらを自動的に殺すには:
sudo lsof -t -i tcp:80 -s tcp:listen | sudo xargs kill
実行するコマンドを示すワンライナーを次に示します:
echo kill $(sudo netstat -anp | awk '/ LISTEN / {if($4 ~ ":80$") { gsub("/.*","",$7); print $7; exit } }')
echo
を置き換えます sudo
まで プロセスが実際に強制終了されるようにします。
jsh の whatisonport
では、開いているポートを一覧表示するための 3 つのオプションが提供されています。 :
netstat -anp --numeric-ports | grep ":${PORT}\>.*:"
fuser -v "${PORT}"/tcp
lsof -P -S 2 -i "tcp:${PORT}" | grep "\(:${PORT}->.*:\|:$PORT (LISTEN)$\)"
私は netstat
が好きです 高速で簡潔で、他のユーザーが開いたポートを一覧表示できるためです。 (ただし、そのようなプロセスの名前と PID を一覧表示するには、依然としてスーパーユーザー/ユーザー権限が必要です。)
アウトプット
$ netstat -anp --numeric-ports | grep ":80\>.*:"
tcp6 0 0 :::80 :::* LISTEN 1914/apache2
$ fuser -v "80/tcp"
USER PID ACCESS COMMAND
80/tcp: root 1914 F.... apache2
www-data 12418 F.... apache2
...
$ lsof -P -S 2 -i "tcp:80" | grep "\(:80->.*:\|:80 (LISTEN)$\)"
apache2 1914 root 4u IPv6 11920 0t0 TCP *:80 (LISTEN)
apache2 12418 www-data 4u IPv6 11920 0t0 TCP *:80 (LISTEN)
...
grep
の使用 2 つのケースでは、ローカル側のポートのみを照合し、リモート ポート 80 への開いている接続をスキップします (代わりに -l
を使用することもできます)。 netstat
で 、または lsof
を使用 -sTCP:LISTEN
を使用するには 、しかし、発信もキャッチするので、上記のgrepが好きです からの接続 指定されたポート。これは時折重要になる場合があります。)
lsof
で -P
を使用します :80
を表示するには :http
の代わりに grep を可能にします。 -S 2
オプションは lsof
を強制します タイムリーに完了します。
プロセスの強制終了
netstat
を使用すると仮定します 、次のように PID を取得できます:
$ netstat -anp --numeric-ports | grep ":80\>.*:" | grep -o "[0-9]*/" | sed 's+/$++'
1914
...
これらの PID を kill
に渡すこともできます :
... | xargs -d '\n' kill -KILL
ただし、正規表現を使用すると誤検知が発生する可能性が高いため、netstat
の初期出力を確認することをお勧めします。 そして、実行するかどうかを手動で決定します:
$ kill -KILL 1914
こちらもご覧ください
listopenports
という別のスクリプトがあります