web-dev-qa-db-ja.com

/ proc /のすべてのプロセスを繰り返すことなく、ソケットのPID(またはcgroup)を識別する方法はありますか

ソケットを指定して、プロセスのcgroupを特定する必要があります。具体的には、tcpを使用して自分のプロセスを呼び出している同じマシン上にプロセスがあり、プロセスまたはそのcgroupを識別する必要があります。 tcp要件は、サードパーティのAPIをシミュレートしているためです。呼び出しているプロセスに応じて、異なるデータを返す必要があります。 1つの解決策は、/ proc/net/tcpを使用してソケットを決定し、そこからソケットのiノードを取得し、/ proc/*/fdを反復して、リストされているそのiノードを見つけることです。この反復なしで(私はsockfsと思います)iノードからPIDに直接マップする方法はありますか?

5
jamie

一般に、ソケットの反対側にあるものを見つけるには、/procを反復処理する必要があります。もちろん、これはnetstatlsofssなどの既存のツールに代わって実行させることもできます。

これは、さまざまなプロセスでソケットを開くことができるためです。プロセスがソケットを開くと、それはforkでき、子は特権を変更して別の名前空間に切り替えることができます。 UNIXソケットの補助データを使用して、ファイル記述子をプロセスから関連のないプロセスに渡すこともできます。したがって、任意のプロセスが同じソケットを開くことができます。 「ソケットのPID」などはなく、「ソケットのPID」のみです。

これは、ソケットが与えられたPIDを列挙する方法がないことを証明していませんが、特に非rootユーザーがプロセスによってファイルが開かれたことを知ることができないと考える場合、そのようなインターフェースを設計することは非常に困難です。別のユーザーとして実行しています。 /procを介したアクセスは、アクセス許可によるセキュリティを適用します。同じデータを取得する他のインターフェイスについては知りません。また、fuserlsofnetstatおよびssはすべて/procを列挙します。別のインターフェースがあったら、誰かがそれを使うことを期待します。だから他に方法はないと確信しています。

tcpポート番号がわかっている場合は、ターミナルで次のコマンドを使用できます。

$ lsof | grep TCP | grep your_port_number

例:lsof | grep TCP | grep 1234

0
Nithin Kurian

Cgroupを判別するには、_sk_cgrp_data_の_struct sock_フィールドを参照できます。これは、_kernel/bpf/cgroup.c_の__cgroup_bpf_run_filter_sock_ops()の例です。

_struct cgroup *cgrp = sock_cgroup_ptr(&sk->sk_cgrp_data)
_