주어진 소켓에 대한 프로세스의 cgroup을 식별해야 합니다. 특히, tcp를 사용하여 내 프로세스를 호출하는 동일한 시스템에 프로세스가 있으며 해당 프로세스 또는 해당 cgroup을 식별해야 합니다. tcp 요구 사항은 타사 API를 조롱하기 때문입니다. 나를 호출하는 프로세스에 따라 다른 데이터를 반환해야 합니다. 한 가지 해결책은 소켓의 inode를 얻을 수 있는 /proc/net/tcp를 사용하여 소켓을 확인한 다음 /proc/*/fd를 반복하여 나열된 inode를 찾는 것입니다. 이 반복 없이 (sockfs라고 가정) inode에서 PID로 매핑하는 직접적인 방법이 있습니까?
답변1
일반적으로 소켓의 다른 쪽 끝에 있는 것을 찾으려면 를 반복해야 합니다 /proc
. 물론 이는 기존 도구(예 netstat
: lsof
또는 ) 가 ss
작업을 수행하도록 하는 것을 의미할 수 있습니다.
그 이유는 소켓이 다른 프로세스에 의해 열릴 수 있기 때문입니다. 프로세스가 소켓을 열면 분기할 수 있으며 하위 프로세스는 권한을 변경하고 다른 네임스페이스로 전환할 수 있습니다. Unix 소켓의 보조 데이터를 사용하여 프로세스에서 관련 없는 프로세스로 파일 설명자를 전달할 수도 있습니다. 따라서 모든 프로세스가 동일한 소켓을 열 수 있습니다. "소켓의 PID"라는 것은 없고 "소켓의 PID"만 있습니다.
이것이 주어진 소켓의 PID를 열거하는 방법이 없다는 것을 증명하지는 않지만, 그러한 인터페이스를 설계하는 것은 매우 어려울 것입니다. 특히 루트가 아닌 사용자가 프로세스가 언제 완료되었는지 알 수 있는 방법이 없다는 점을 고려할 때 더욱 그렇습니다. 다른 사용자로 실행할 때 파일이 열립니다. 액세스는 /proc
권한을 통해 보안을 강화하며 동일한 데이터를 얻기 위한 다른 인터페이스를 모릅니다. 또한, fuser
, 및 모든 열거형 ; 다른 인터페이스 lsof
가 있다면 누군가가 그것을 사용하기를 바랍니다. 그래서 다른 방법은 없다고 확신합니다.netstat
ss
/proc
답변2
cgroup을 결정하려면 .cgroup sk_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