주기적으로 소켓 상태를 관찰하고 싶기 때문에 명령어를 통해 소켓 상태를 확인해야 합니다.
현재 모든 청취 소켓을 나열 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.