임베디드 리눅스에서 어떤 프로세스가 어떤 포트를 사용하는지 알고 싶습니다. 단순한 임베디드 리눅스이기 때문에 netstat, lsof와 같은 네트워크 명령 행이 없습니다. cat, cp, echo 등과 같은 기본 명령 줄 만 존재합니다.
부분적인 해결책은 “cat / proc / net / tcp”및 “cat / proc / net / udp”명령 행을 사용하는 것 같습니다. 그러나, 나는 확실히 사용하는 명령 줄 프로그램 모든 포트에서 인쇄 된 목록이 아니다 , 그리고 목록은 특정 포트에 바인더 제본되는 과정을 표시하지 않습니다 .
모든 의견을 부탁드립니다.
답변
/proc/net/tcp
및 에서 열려있는 모든 포트를 찾을 수 있어야합니다 /proc/net/udp
. 각 파일에는 inode
해당 소켓을 소유 한 프로세스를 찾는 데 사용할 수 있는 열이 있습니다.
inode 번호가 있으면 ls 명령을 실행 ls -l /proc/*/fd/* | grep socket:.$INODE
하여 해당 소켓을 사용하는 프로세스를 찾을 수 있습니다. 프로세스가 다른 스레드에 대해 다른 파일 디스크립터로 설정되어있는 경우, ls -l /proc/*/task/*/fd/* | grep socket:.$INODE
이를 모두 찾으 려면 명령을 확장해야 할 수도 있습니다 .
답변
모든 포트의 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}'