프로세스가 포트에서 요청을 받기 시작할 때까지 스크립트가 대기하도록하려면 어떻게합니까?


33

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

리눅스에 뭔가가 있습니까?

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

...

답변:


52

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

간단한 TCP 또는 UDP 클라이언트를 원한다면 쉘에서 간단히 구동 할 수 있으며 netcat을 사용하십시오 . 대화를 프로그래밍하는 방법은 프로토콜에 따라 다릅니다. 많은 프로토콜이 서버가 특정 입력에서 연결을 닫게하고 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.


netcat이 답이라고 생각합니다. 감사합니다. 명확히하기 위해, 내가하려고하는 것은로드 밸런싱 절차의 일부로 스크립트를 작성하는 것입니다. 프로세스를 시작하고 포트에서 요청을 수락 한 후 원본을 종료해야합니다. 내 자신의 스크립트를 작성하는 것보다 더 좋은 방법이 있다면, 나는 모두 귀입니다.

@ 윌 : 그것은 매우 다른 질문입니다! 나는 다른 대답을 썼다.
Gilles 'SO- 악의를 멈춰라'

1
나는 netcat 솔루션도 좋아한다. nc -w 2 </dev/null >/dev/null연결 시간이 2 초 이상 걸리고 시간이 초과되어 실패하면 사용에 편리한 스크립트를 사용합니다.
ephemient

참고로, 'while nc -q 1 localhost 13000 </ dev / null;을 얻을 수 없습니다. 잠을 자고 10; 일을 했어요. 그냥 즉시 돌아옵니다. 첫 번째는 잘 작동합니다. 감사!
엘리스 퍼시벌

@Flyte nc -q 1 localhost 13000 </dev/null는 서버가 수신 대기하지 않는 경우 즉시 반환하지만 오류 코드와 함께 반환되므로 루프는 서버를 절전 모드로 만들고 몇 초 후에 다시 시도합니다.
Gilles 'SO- 악의를 멈춰라'

17

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

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

- 정교하게하기 위해, 배쉬는 "네트워크 리디렉션"을 사용하여 TCP 소켓에 연결하는 옵션 기능이 gnu.org/software/bash/manual/html_node/...
johntellsall

7

tcp sockets magic을 사용한 이전 예제에 이어 bash제한된 시간 동안 연결을 기다리는 향상된 버전이 있습니다.

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

차이점은에서 연결을 사용할 수 15s없으면 영원히 반복되지 않고 오류 코드로 종료된다는 것입니다.

초기화 스크립트가 시작 후 서비스 준비 / 가용성을 기다리는 데 유용합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.