ポートにバインドされているプロセスの特定


90

私はコマンドを使用することを知っています:

lsof -i TCP 

(またはlsofを使用したパラメーターのバリアント)特定のポートにバインドされているプロセスを特定できます。これは、8080にバインドしたいものを開始しようとしていて、他の誰かがすでにそのポートを使用しているが、何がわからない場合に便利です。

lsofを使用せずにこれを行う簡単な方法はありますか?多くのシステムでの作業に時間を費やしており、lsofがインストールされていないことがよくあります。

回答:


112

netstat -lnp各リスニングポートの横にpidとプロセス名をリストします。これはLinuxでも機能しますが、他のすべて(AIXなど)では機能し-tません。TCPのみが必要な場合は追加します。

# netstat -lntp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:24800           0.0.0.0:*               LISTEN      27899/synergys
tcp        0      0 0.0.0.0:8000            0.0.0.0:*               LISTEN      3361/python
tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN      2264/mysqld
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      22964/apache2
tcp        0      0 192.168.99.1:53         0.0.0.0:*               LISTEN      3389/named
tcp        0      0 192.168.88.1:53         0.0.0.0:*               LISTEN      3389/named


クール、ありがとう。そのように見えますが、RHELでは動作しますが、Solarisでは動作しません(あなたが示したとおり)。Solarisに似たようなものがあるかどうか誰もが知っていますか?

netstat -p上記は私の投票です。もご覧くださいlsof
リッチホモルカ

余談ですが、Windowsの場合も同様です:netstat -aon | もっと
ジョナサン14

SCTPはどうですか?
sudo

12

AIXでは、netstatとrmsockを使用してプロセスバインディングを決定できます。

[root@aix] netstat -Ana|grep LISTEN|grep 80
f100070000280bb0 tcp4       0      0  *.37               *.*        LISTEN
f1000700025de3b0 tcp        0      0  *.80               *.*        LISTEN
f1000700002803b0 tcp4       0      0  *.111              *.*        LISTEN
f1000700021b33b0 tcp4       0      0  127.0.0.1.32780    *.*        LISTEN

# Port 80 maps to f1000700025de3b0 above, so we type:
[root@aix] rmsock f1000700025de3b0 tcpcb
The socket 0x25de008 is being held by process 499790 (java).

1
これをありがとう!(ソケットを削除しようとするrmsockを使用する代わりに)ソケットでリッスンするプロセスを表示する方法はありますか?
オリビエデュラック

2
@OlivierDulac:「名前が意味するものとは異なり、rmsockは、プロセスで使用されているソケットを削除しません。ソケットを保持しているプロセスを報告するだけです。」(ibm.com/developerworks/community/blogs/cgaix/entry/...
ビトーPyの

@ vitor-braga:ああ!私はそれが試みていたと思ったが、それを削除できなかったときにどのプロセスが保持されるかだけを言った。どうやら、プロセスが保持しているときに削除しようとさえしないようです。カッコいい!どうも!
オリビエデュラック

8

Linuxで利用できる別のツールはssです。Fedoraのss manページから:

NAME
       ss - another utility to investigate sockets
SYNOPSIS
       ss [options] [ FILTER ]
DESCRIPTION
       ss is used to dump socket statistics. It allows showing information 
       similar to netstat. It can display more TCP and state informations  
       than other tools.

以下の出力例-最後の列はプロセスバインディングを示しています。

[root@box] ss -ap
State      Recv-Q Send-Q      Local Address:Port          Peer Address:Port
LISTEN     0      128                    :::http                    :::*        users:(("httpd",20891,4),("httpd",20894,4),("httpd",20895,4),("httpd",20896,4)
LISTEN     0      128             127.0.0.1:munin                    *:*        users:(("munin-node",1278,5))
LISTEN     0      128                    :::ssh                     :::*        users:(("sshd",1175,4))
LISTEN     0      128                     *:ssh                      *:*        users:(("sshd",1175,3))
LISTEN     0      10              127.0.0.1:smtp                     *:*        users:(("sendmail",1199,4))
LISTEN     0      128             127.0.0.1:x11-ssh-offset                  *:*        users:(("sshd",25734,8))
LISTEN     0      128                   ::1:x11-ssh-offset                 :::*        users:(("sshd",25734,7))


2

私はかつて、特定のポートの背後にあるプロセスを判別しようとしていました(今回は8000でした)。さまざまなlsofとnetstatを試しましたが、チャンスをつかんで、ブラウザ(つまり、http:// hostname:8000 /)でポートにアクセスしてみました。見よ、スプラッシュスクリーンが私を迎え、プロセスが何であるかが明らかになりました(レコードの場合、それはSplunkでした)。

もう1つの考え:「ps -e -o pid、args」(YMMV)は、引数リストにポート番号を表示する場合があります。Grepはあなたの友達です!


同様にtelnet hostname 8000、サーバーがバナーを印刷するかどうかを確認できます。ただし、シェルアクセスのないマシンでサーバーが実行されており、プロセスIDの検索が適切でない場合、これは主に役立ちます。
ジル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.