프로세스가 특정 포트에서 요청 수락을 시작할 때까지 기다리는 명령이 필요합니다.
리눅스에 이런 일을 할 수 있는 것이 있나요?
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
하고 포팅합니다 .