프로세스가 포트에서 요청 수락을 시작할 때까지 기다리도록 스크립트에 어떻게 지시합니까?

프로세스가 포트에서 요청 수락을 시작할 때까지 기다리도록 스크립트에 어떻게 지시합니까?

프로세스가 특정 포트에서 요청 수락을 시작할 때까지 기다리는 명령이 필요합니다.

리눅스에 이런 일을 할 수 있는 것이 있나요?

while (checkAlive -host localhost -port 13000 == false)
  do some waiting

...

답변1

서버가 연결을 수락하는지 확인하는 가장 좋은 테스트는 실제로 연결을 시도하는 것입니다. 서버가 사용하는 프로토콜에 관계없이 일반 클라이언트를 사용하고 no-op 명령을 사용해 보십시오.

경량 TCP 또는 UDP 클라이언트를 원할 경우 다음을 사용하여 셸에서 간단히 구동할 수 있습니다.인터넷 고양이. 대화를 프로그래밍하는 방법은 프로토콜에 따라 다릅니다. 많은 프로토콜에서 서버가 일부 입력에 대한 연결을 닫으면 netcat이 종료됩니다.

while ! echo exit | nc localhost 13000; do sleep 10; done

연결을 설정한 후 netcat에 종료하도록 지시할 수도 있습니다. 연결이 없으면 1을 반환하고, 연결이 있으면 0을 반환하므로 출력을 무효화합니다. netcat 버전에 따라 다음 명령 중 하나 또는 모두를 지원할 수 있습니다.

while ! nc -z localhost 13000 </dev/null; do sleep 10; done
while ! nc -q 1 localhost 13000 </dev/null; do sleep 10; done

또 다른 접근 방식은 서버 프로세스가 청취 소켓을 열 때까지 기다리는 것입니다.

while netstat -lnt | awk '$4 ~ /:13000$/ {exit 1}'; do sleep 10; done

Mac OS를 사용하는 경우 netstat는 약간 다른 출력 형식을 사용하므로 다음 형식이 필요합니다.

while netstat -lnt | awk '$4 ~ /\.13000$/ {exit 1}'; do sleep 10; done

또는 특정 프로세스 ID를 타겟팅할 수도 있습니다.

while ! lsof -n -Fn -p $pid | grep -q '^n.*:13000$'; do sleep 10; done

.ptrace

답변2

bash 및 coreutils(예: 시간 초과, 절전)은 있지만 nc/lsof/netstat는 없는 경우 bash 매직 tcp 소켓을 사용하는 이 솔루션을 사용할 수 있습니다.

while ! timeout 1 bash -c "echo > /dev/tcp/localhost/13000"; do sleep 10; done

답변3

따르다이전 예TCP 소켓 매직을 사용하여 bash제한된 시간 동안 연결을 기다리는 향상된 버전입니다.

timeout 15 bash -c 'until echo > /dev/tcp/localhost/13000; do sleep 0.5; done'

차이점은 - 기간 동안 연결을 사용할 수 없는 경우 15s영원히 반복되지 않고 오류 코드와 함께 종료된다는 것입니다.

이는 시작 후 서비스가 준비/사용 가능해질 때까지 기다리는 초기화 스크립트에서 유용합니다.

답변4

나는 이것을 사용하여 netcat 없이 여러 포트가 열릴 때까지 기다립니다.

while (! (: </dev/tcp/localhost/27017) &> /dev/null || ! (: </dev/tcp/localhost/9200) &> /dev/null); do
    sleep 2;
done

필요에 따라 변경 localhost하고 포팅합니다 .

관련 정보