特定のソケットのプロセスのcgroupを識別する必要があります。特に、tcpを使用して自分のプロセスを呼び出すのと同じシステムにプロセスがあり、そのプロセスまたはそのcgroupを識別する必要があります。 tcpの要件は、サードパーティのAPIをモックするためです。私を呼び出すプロセスに応じて別のデータを返す必要があります。 1つの解決策は、ソケットのinodeを取得できる/proc/net/tcpを使用してソケットを確認し、次に/proc/*/fdを繰り返してリストされたinodeを見つけることです。この繰り返しなしで(sockfsと仮定して)inodeからPIDにマッピングする直接的な方法はありますか?
答え1
通常、ソケットのもう一方の端にあるものを見つけるには、を繰り返す必要があります/proc
。もちろん、これは既存のツール(たとえばnetstat
、lsof
または)にss
タスクを実行させることを意味できます。
その理由は、ソケットが他のプロセスによって開かれる可能性があるためです。プロセスがソケットを開くと分岐でき、子プロセスは権限を変更して別の名前空間に切り替えることができます。 Unixソケットの補助データを使用して、プロセスから無関係なプロセスにファイル記述子を渡すこともできます。したがって、すべてのプロセスが同じソケットを開くことができます。 「ソケットのPID」というものはなく、「ソケットのPID」だけがあります。
これは与えられたソケットのPIDを列挙する方法がないことを証明するものではありませんが、そのようなインタフェースを設計することは非常に難しいでしょう。特に、root以外のユーザーがプロセスがいつ完了したかを知る方法がないことを考えると、さらにそうです。別のユーザーとして実行すると、ファイルが開きます。アクセスは/proc
権限を通じてセキュリティを強化し、同じデータを取得するための他のインターフェイスを知りません。さらに、、およびfuser
すべての列挙型。他のインターフェースlsof
がある場合は、誰かがそれを使用することを願っています。だから他の方法はないと確信しています。netstat
ss
/proc
答え2
cgroupを決定するには、.cgroupsk_cgrp_data
のフィールドを参照してくださいstruct sock
。これは次の__cgroup_bpf_run_filter_sock_ops()
例ですkernel/bpf/cgroup.c
。
struct cgroup *cgrp = sock_cgroup_ptr(&sk->sk_cgrp_data)
答え3
TCP ポート番号がわかっている場合は、端末で次のコマンドを使用できます。
$ lsof | grep TCP |ポート番号を問い合わせてください。
例:lsof | grep TCP クエリ正規表現 1234