lsof 변형에 대한 다른 출력

lsof 변형에 대한 다른 출력

MongoDB Java 드라이버(2.11.3)를 사용하는 Java 애플리케이션이 있습니다. 설명서에 명시된 대로 연결 풀링을 처리해야 하는 애플리케이션 전체에서 정적 MongoClient 인스턴스를 사용하고 있습니다. 오랜 시간이 지나면(Minecraft에 익숙하다면 BungeeCord입니다) 열린 파일이 너무 많다는 예외가 발생합니다. 보세요

$ lsof -p 7616 -n | grep "123.456.7.8:27017" | wc -l
6

포트 27017에 16개의 연결이 있음을 보여줍니다. 그러나 우리가 보면:

$ lsof -n | grep "123.456.7.8:27017" | awk '{print $2}' | grep 7616 | wc -l
438

첫 번째 명령보다 더 많은 연결을 보여줍니다.

첫 번째 질문은 이 두 명령의 출력이 서로 다른 이유이고, 두 번째 질문은 Java MongoDB 드라이버를 사용할 때 비슷한 상황을 경험한 사람이 있는지입니다.

답변1

실제 출력을 보지 않고는 확실히 말할 수 없지만 가장 가능성 있는 설명은 27017다른 위치에서 발생한다는 것입니다. 첫 번째 명령은 PID가 있는 프로세스에 대한 파일을 나열한 5253다음 다음을 포함하는 모든 줄을 인쇄합니다.27017 대기열의 어느 곳에서나.

두 번째 명령은 열려 있는 모든 파일을 인쇄한 다음 다시 다음을 포함하는 모든 줄을 선택합니다.27017 대기열의 어느 곳에서나. 나는 당신이 당신의 질문에 지적한 것과는 27017달리 두 번째 명령에서도 실제로 greping하고 있다고 가정합니다.16062

어떤 경우에도 명령은 포트를 구체적으로 확인하지 않습니다 27017. 사실, 왜 포트가 나열되기를 기대했는지조차 이해가 되지 않습니다. lsof포트가 아닌 파일을 살펴보십시오. 예를 들어, 내 시스템에서 출력을 찾을 때 ssh포트가 표시되지 않습니다.lsof -n

어쨌든 좀 더 구체적인 예를 들면 다음과 같습니다.

$ sudo lsof -np 7033 | head
lsof: WARNING: can't stat() fuse.gvfsd-fuse file system /run/user/1000/gvfs
      Output information may be incomplete.
COMMAND  PID   USER   FD   TYPE             DEVICE SIZE/OFF      NODE NAME
firefox 7033 terdon  cwd    DIR                8,6   491520  16646145 /home/terdon
firefox 7033 terdon  rtd    DIR                8,7   548864         2 /
firefox 7033 terdon  txt    REG                8,7   143680   1841618 /opt/firefox/firefox
firefox 7033 terdon  DEL    REG               0,30           10335506 /tmp/.glT5RaDf
firefox 7033 terdon  mem    REG                8,7 12303504   1573445 /usr/share/fonts/truetype/unifont/unifont.ttf
firefox 7033 terdon  DEL    REG                0,4          970489906 /SYSV00000000
firefox 7033 terdon  mem    REG                8,7  7470672    540090 /usr/lib/x86_64-linux-gnu/gstreamer-0.10/libgstffmpeg.so
firefox 7033 terdon  mem    REG                8,7  5177387   1580807 /usr/share/fonts/truetype/wqy/wqy-microhei.ttc
firefox 7033 terdon  mem    REG                8,7   120688    532953 /usr/lib/x86_64-linux-gnu/gstreamer-0.10/libgstvideoscale.so

검색어는 27017모든 필드에서 일치할 수 있습니다. 크기, PID, 노드 등이 될 수 있습니다. 다른 번호의 일부일 수도 있습니다. 예를 들어:

$ printf "12345\n12" | grep 12
12345
12

위에서 볼 수 있듯이 12단어를 구성하는 두 번째 줄뿐만 아니라 두 줄 모두에 일치 항목이 있습니다. 이 -w스위치를 사용하여 grep전체 단어만 일치시킬 수 있습니다 .

$ printf "12345\n12" | grep -w 12
12

따라서 두 번째 명령에서 PID로 출력을 제한하지 않기 때문에 두 greps는 각 줄의 어느 위치에서나 일치할 수 있으므로 물론 출력이 달라집니다.

관련 정보