소켓이 수신 중인지 확인하는 방법은 무엇입니까?

소켓이 수신 중인지 확인하는 방법은 무엇입니까?

주기적으로 소켓 상태를 관찰하고 싶기 때문에 명령어를 통해 소켓 상태를 확인해야 합니다.

현재 모든 청취 소켓을 나열 ss하고 grep.

ss -l | grep -q /run/php/php7.0-fpm.sock

소켓 상태를 확인하는 더 좋은 방법이 있습니까?

답변1

연결을 시도하고 연결을 끊기 전에 아무것도 전달하지 않고 아무것도 수락하지 않으면 일부 정보를 얻을 수 있습니다.

socat -u OPEN:/dev/null UNIX-CONNECT:/run/php/php7.0-fpm.sock

최소한 네 가지 가능한 결과가 있습니다.

  • 소켓이 존재하지 않으면 오류는 No such file or directory이고 종료 상태는 입니다 1.

  • 소켓에 대한 쓰기 액세스 권한이 없으면 오류는 이고 Permission denied종료 상태는 입니다 1. 이 경우 프로세스가 수신 중인지 알 수 없습니다.

  • 소켓에 대한 쓰기 액세스 권한이 있고 수신 프로세스가 없는 경우 오류는 이고 Connection refused종료 상태는 입니다 1.

  • 소켓에 대한 쓰기 권한이 있고 프로세스가 수신 대기 중인 경우 연결이 설정됩니다. 이 명령은 아무것도 보내지 않으며(예 cat /dev/null: ) 아무것도 수신하려고 시도하지 않으므로(때문에 -u) 거의 즉시 종료됩니다. 종료 상태는 입니다 0.

    짧지만 여전히 연결이 이루어졌습니다. 청취 프로세스는 하나의 연결만 허용하고 서비스한 후 종료하거나 한 번에 하나씩 연결을 허용하도록 구성할 수 있습니다. 이 경우 프로빙 연결이 최대화됩니다. 이는 바람직하지 않습니다. 그러나 실제로는 대부분의 청취 프로세스가 여러 연결을 서비스하고 연결이 끊긴 클라이언트를 무자비하게 처리할 수 있을 것으로 기대합니다.

노트:

  • 종료 상태를 생성하는 상황을 구별하려면 stderr을 구문 분석해야 합니다 1.
  • 프로세스는 자신이 듣고 있다는 사실을 어떤 프로세스에게도 알리지 않습니다.

답변2

장치 및 inode 번호를 기준으로 일치시킬 수 있습니다.

ss -elx | grep -w "$(stat -c 'ino:%i dev:0/%d' /run/php/php7.0-fpm.sock)"

종료 상태에만 관심이 있는 경우 -q옵션을 제공하십시오(0 = 파일을 수신하는 프로세스가 있는 경우 성공).grep

관련 보기답변그리고 설명과 문제에 대한 링크, 특히 반환된 장치 번호의 잘못된 형식에 대한 부분입니다 ss.

뭔가가 듣고 있는지 알아보기 위해 소켓에 연결하려고 하는 것은 누군가가 아직 살아 있는지 알아보기 위해 누군가를 물어뜯는 것과 같습니다 ;-)

답변3

포트가 열려 있는지 확인하고 싶다면 다음과 같이 텔넷을 사용하는 것이 좋습니다.

telnet localhost <port>

다만, 스크립트를 작성해서 주기적으로 확인하고 싶은 것 같습니다. 위의 훌륭한 답변 외에도 이를 수행하는 방법에 대한 예가 있습니다.

SE 게시물을 통해 확인했습니다.그리고 작동 방식에 대한 정보를 추가하세요.

host=localhost; port=222
r=$(bash -c 'exec 3<> /dev/tcp/'$host'/'$port';echo $?' 2>/dev/null)
if [ "$r" = "0" ]; then
      echo "$host $port is open";
 else
      echo "$host $port is closed"; 
fi

이 라인입니다설명했다:

  • bash -c빈 환경에서 명령을 실행합니다.
  • exec 3<> /dev/tcp/'$host'/'$port'읽고 쓰기 위해 /dev/tcp/'$host'/'$port'를 엽니다.
  • echo $?마지막 명령의 종료 코드(0 또는 0이 아님)를 기록합니다. 변수 "r"은 이 값을 가져옵니다.

이제 0(열림) 또는 0이 아닌(닫힘) 변수 $r이 있습니다. 여기에서 결과를 에코하거나, 로그 파일에 쓰거나, 결과를 이메일로 보내는 등의 작업을 수행할 수 있습니다. cron 작업으로 실행할 수 있습니다.

HTH.

관련 정보