임베디드 리눅스에서 어떤 프로세스가 어떤 포트를 사용하는지 알고 싶습니다. 단순한 임베디드 리눅스이기 때문에 netstat, lsof 등의 네트워크 명령줄이 없습니다. (cat, cp, echo 등 기본 명령줄만 존재합니다.)
솔루션의 일부는 "cat /proc/net/tcp" 및 "cat /proc/net/udp" 명령줄을 사용하는 것 같습니다. 하지만,이 명령줄의 인쇄된 목록에 사용 중인 모든 포트가 표시되는지 확실하지 않습니다., 그리고목록에는 어떤 프로세스가 특정 포트에 바인딩되어 있는지 표시되지 않습니다..
어떤 조언이라도 대단히 감사하겠습니다.
답변1
/proc/net/tcp
및 에서 열려 있는 모든 포트를 찾을 수 있어야 합니다 /proc/net/udp
. 각 파일에는 inode
해당 소켓을 소유한 프로세스를 찾는 데 사용할 수 있는 열이 있습니다.
inode 번호가 있으면 ls 명령을 실행하여 ls -l /proc/*/fd/* | grep socket:.$INODE
해당 소켓을 사용하는 프로세스를 찾을 수 있습니다. 프로세스에 서로 다른 스레드에 대해 설정된 서로 다른 파일 설명자가 있는 경우 명령을 확장하여 ls -l /proc/*/task/*/fd/* | grep socket:.$INODE
모든 파일 설명자를 찾아야 할 수도 있습니다.
답변2
포트의 INODES를 찾으려면 다음 명령을 실행하십시오.
PORT=8080;cat /proc/net/* | awk -F " " '{print $2 ":" $10 }' | grep -i `printf "%x:" $PORT` | awk -F ":" '{print "PORT=" $2 ", INODE=" $3 }'
아래와 같이 위 명령 출력에서 INODE를 사용하여 관련 PID를 찾습니다.
find /proc -lname "socket:\[$INODE\]" 2> /dev/null | head -n 1 | awk -F "/" '{print "PID="$3}'
여기서 $INODE는 INODE의 값입니다.
한 줄 명령으로 아래와 같이 포트가 열려 있고 PID와 연결되어 있는지 확인할 수 있습니다.
PORT=8080;find /proc -lname "socket:\[$(cat /proc/net/* | awk -F " " '{print $2 ":" $10 }' | grep -i `printf "%x:" $PORT` | head -n 1 | awk -F ":" '{print $3}')\]" 2> /dev/null | head -n 1 | awk -F "/" '{print "PID="$3}'