카테고리 보관물: Unix

Unix

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

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

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

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

...


답변

서버가 연결을 수락하는지 확인하는 가장 좋은 테스트는 실제로 연결을 시도하는 것입니다. 서버가 말하는 프로토콜에 관계없이 일반 클라이언트를 사용하고 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.


답변

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

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

답변

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

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

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

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


답변