/proc/のすべてのプロセスを繰り返さずにソケットのPID(またはcgroup)を識別する方法はありますか?

/proc/のすべてのプロセスを繰り返さずにソケットのPID(またはcgroup)を識別する方法はありますか?

特定のソケットのプロセスのcgroupを識別する必要があります。特に、tcpを使用して自分のプロセスを呼び出すのと同じシステムにプロセスがあり、そのプロセスまたはそのcgroupを識別する必要があります。 tcpの要件は、サードパーティのAPIをモックするためです。私を呼び出すプロセスに応じて別のデータを返す必要があります。 1つの解決策は、ソケットのinodeを取得できる/proc/net/tcpを使用してソケットを確認し、次に/proc/*/fdを繰り返してリストされたinodeを見つけることです。この繰り返しなしで(sockfsと仮定して)inodeからPIDにマッピングする直接的な方法はありますか?

ベストアンサー1

通常、ソケットのもう一方の端にあるものを見つけるには、を繰り返す必要があります/proc。もちろん、これは既存のツール(たとえばnetstatlsofまたは)にssタスクを実行させることを意味できます。

その理由は、ソケットが他のプロセスによって開かれる可能性があるためです。プロセスがソケットを開くと分岐でき、子プロセスは権限を変更して別の名前空間に切り替えることができます。 Unixソケットの補助データを使用して、プロセスから無関係なプロセスにファイル記述子を渡すこともできます。したがって、すべてのプロセスが同じソケットを開くことができます。 「ソケットのPID」というものはなく、「ソケットのPID」だけがあります。

これは与えられたソケットのPIDを列挙する方法がないことを証明するものではありませんが、そのようなインタフェースを設計することは非常に難しいでしょう。特に、root以外のユーザーがプロセスがいつ完了したかを知る方法がないことを考えると、さらにそうです。別のユーザーとして実行すると、ファイルが開きます。アクセスは/proc権限を通じてセキュリティを強化し、同じデータを取得するための他のインターフェイスを知りません。さらに、、およびfuserすべての列挙型。他のインターフェースlsofがある場合は、誰かがそれを使用することを願っています。だから他の方法はないと確信しています。netstatss/proc

おすすめ記事