web-dev-qa-db-ja.com

/ proc / fd内のソケットファイルの詳細を確認するにはどうすればよいですか?

/ proc/$ mypid/fd /を見ると、これらのファイルが見つかります

lrwx------ 1 cm_user cm_user 64 Oct 14 03:21 0 -> /dev/pts/36 (deleted)
lrwx------ 1 cm_user cm_user 64 Oct 14 03:21 3 -> socket:[1424055856]
lrwx------ 1 cm_user cm_user 64 Oct 14 03:21 4 -> socket:[1424055868]
lrwx------ 1 cm_user cm_user 64 Oct 14 03:21 5 -> socket:[1424055882]

コードにアクセスできるので、これらのソケットはTCP接続に関連付けられています(1つは一部のマシンのポート5672への接続、もう1つは他のマシンのポート3306への接続です)。 、しかしどのソケットがどの接続に関連付けられているのか知りたいのですが、どうすればいいですか?

より一般的には、ソケットの反対側にあるものをOSにどのように確認できますか?

42
benhsu

コマンドlsof

良いオプションはlsofかもしれません。 man lsofには、open files such as Internet sockets or Unix Domain socketsに関する情報を取得するのに便利なように記載されています。


それを使う

最初に、/proc/$PID/fd/と一覧表示されているソケット番号に関する概要を取得します。
たとえば、socket:[14240]に興味があるかもしれません。

次に、lsof -i -a -p $PIDを使用して、$PIDが使用するすべてのネットワークファイルのリストを出力します。

  • -iは、ユーザーまたはプロセスに属するネットワークファイルのリストを生成します

  • -aは、論理的に結合するか、ANDで指定したパラメータを組み合わせます

  • -p $PIDは、プロセスに関する情報のみを選択します

2543のPIDで実行している私のブラウザーの一般的な出力は次のようになります。

COMMAND  PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
browser 2543 pidi   55u  IPv4  14240      0t0  TCP  pidi.router.lan:55038->stackoverflow.com:https (ESTABLISHED)

より類似した行。

すごい!次に、DEVICE列を詳しく見てみましょう。以前にリストした/proc/$PID/fd/のソケットと一致します。
そしてNAMEセクションのおかげで、ソケットのもう一方の端が何であるかを言うことができます。

実際の実行では、かなりの量の出力が得られる可能性がありますが、関心のあるソケットをフィルターまたはgrepするだけです。

私はすべてのコマンドを組み合わせることができると確信していますが、それであなたは始めるのに十分なはずです。

50
pidi