각 프로세스에 대한 기존 TCP 연결을 모두 열거하는 코드(와 유사한)를 구현하려고 합니다 netstat -lptn
. 나는 그것에 의존하기보다는 직접 구현하는 것을 선호합니다 netstat
. 이를 위해 /proc/<PID>/net/tcp
.
아래에 나열된 많은 TCP 연결이 표시되지만 /proc/<PID>/net/tcp
명령을 통해서는 표시되지 않습니다 netstat -lptn
.
/proc/1/net/tcp
예를 들어, 여러 TCP 연결 에서 이것을 보았습니다 /proc/2/net/tcp
(Ubuntu 16에서 시도했습니다). 내가 이해한 바에 따르면 이는 TCP 연결이 없어야 하는 프로세스와 관련이 있습니다 /proc/1/net/tcp
. 또한 /sbin/init
이와 관련된 TCP 연결도 없어야 합니다 /proc/2/net/tcp
.kthreadd
답변1
귀하의 접근 방식에 대해 많은 오해가 있습니다. 하나씩 검토하겠습니다.
- 소켓은 특정 프로세스와 연결되지 않습니다. 소켓이 생성되면 참조 횟수는 1입니다. 그러나 다른 방법(예
dup2
:fork
파일 설명자 전달)을 통해 동일한 소켓에 대한 많은 참조를 생성하여 참조 횟수가 증가할 수 있습니다. 이러한 참조 중 일부는 많은 스레드에서 사용할 수 있는 열린 파일 설명자 테이블에서 나올 수 있습니다. 이러한 스레드는 동일한 스레드 그룹(PID)에 속할 수도 있고 다른 스레드 그룹에 속할 수도 있습니다. 이-p
플래그를 사용하면netstat
각 프로세스에 액세스할 수 있는 소켓을 열거하고 알려진 각 소켓에 대한 프로세스를 찾으려고 시도합니다. 후보 프로세스가 여러 개인 경우 관심 있는 프로세스가 표시된다는 보장은 없습니다. /proc/<PID>/net/tcp
이 프로세스와 관련된 소켓만 나열되는 것은 아닙니다. 프로세스가 속한 네트워크 네임스페이스의 모든 TCPv4 소켓을 나열합니다. 기본 구성에서는 시스템의 모든 프로세스가 단일 네트워크 네임스페이스에 속하므로 모든 PID에 대해 동일한 결과가 표시됩니다. 이는 또한 네트워크를 사용하지 않는 스레드/프로세스가 이 파일에 콘텐츠를 가지고 있는 이유를 설명합니다. 네트워크 자체를 사용하지 않더라도 다른 프로세스가 네트워크를 사용할 수 있는 네트워크 네임스페이스에 속합니다./proc/<PID>/net/tcp
청취 및 연결 소켓이 포함되어 있습니다.-l
이를 전달하면netstat
청취 소켓만 표시됩니다. 출력을 더 가깝게 일치시키려면-a
대신 가 필요합니다-l
./proc/<PID>/net/tcp
TCPv4 소켓만 포함합니다./proc/<PID>/net/tcp6
또한 모든 TCP 소켓을 보려면 이를 사용해야 합니다 .
자신의 프로세스와 동일한 네임스페이스에 있는 소켓에만 관심이 있는 경우 다른 PID를 반복할 필요가 없습니다. yes /proc/net/tcp
이후 대신 심볼릭 링크를 사용할 수 있습니다 ./proc/net/tcp6
/proc/net
/proc/self/net
답변2
사용 /proc/<pid>/fd
- 프로세스에서 사용 중인 소켓을 포함하여 열려 있는 모든 파일 설명자를 나열합니다. 예를 들어
/proc/1278482/fd:
total 0
dr-xr-xr-x. 9 user user 0 Apr 22 23:30 ../
dr-x------. 2 user user 0 Apr 22 23:30 ./
lr-x------. 1 user user 64 Apr 22 23:30 4 -> pipe:[640683476]
lrwx------. 1 user user 64 Apr 22 23:30 3 -> socket:[640754628]
lrwx------. 1 user user 64 Apr 22 23:30 2 -> /dev/pts/10
l-wx------. 1 user user 64 Apr 22 23:30 1 -> /home/user/my_sockets.txt
lrwx------. 1 user user 64 Apr 22 23:30 0 -> /dev/pts/10
그런 다음 해당 항목(예: 640754628)을 찾아 /proc/<pid>/net/tcp -> inode[6]
소켓의 모든 세부 정보를 얻을 수 있습니다.
tcp:
sl local_address rem_address st tx_queue rx_queue tr tm->when retrnsmt uid timeout inode
1864: 0100007F:A650 0100007F:18EB 01 00000000:00000000 00:00000000 00000000 500 0 640754628 1 0000000000000000 20 4 30 10 -1
(위 예시는 127.0.0.1:6379에 대한 로컬 연결입니다)