Potrzebuję polecenia, które będzie czekać na proces, aby rozpocząć przyjmowanie żądań na określonym porcie.
Czy jest coś takiego w Linuksie?
while (checkAlive -host localhost -port 13000 == false)
do some waiting
...
Potrzebuję polecenia, które będzie czekać na proces, aby rozpocząć przyjmowanie żądań na określonym porcie.
Czy jest coś takiego w Linuksie?
while (checkAlive -host localhost -port 13000 == false)
do some waiting
...
Najlepszym testem, aby sprawdzić, czy serwer akceptuje połączenia, jest próba połączenia. Użyj zwykłego klienta dla dowolnego protokołu, który mówi Twój serwer, i wypróbuj polecenie no-op.
Jeśli chcesz mieć lekkiego klienta TCP lub UDP, możesz po prostu jeździć z powłoki, użyj netcat . Sposób zaprogramowania rozmowy zależy od protokołu; w wielu protokołach serwer zamyka połączenie na określonym wejściu, a następnie netcat kończy działanie.
while ! echo exit | nc localhost 13000; do sleep 10; done
Możesz także powiedzieć netcat, aby zakończył pracę po ustanowieniu połączenia. Zwraca 1, jeśli nie ma połączenia, i 0, jeśli tak, dlatego negujemy jego wynik. W zależności od wersji programu netcat może on obsługiwać jedno lub oba z następujących poleceń:
while ! nc -z localhost 13000 </dev/null; do sleep 10; done
while ! nc -q 1 localhost 13000 </dev/null; do sleep 10; done
Alternatywnym podejściem jest czekanie, aż proces serwera otworzy gniazdo nasłuchujące.
while netstat -lnt | awk '$4 ~ /:13000$/ {exit 1}'; do sleep 10; done
Jeśli korzystasz z systemu Mac OS, netstat używa nieco innego formatu wyjściowego, więc powinieneś mieć następujące intead:
while netstat -lnt | awk '$4 ~ /\.13000$/ {exit 1}'; do sleep 10; done
Lub możesz kierować na określony identyfikator procesu:
while ! lsof -n -Fn -p $pid | grep -q '^n.*:13000$'; do sleep 10; done
Nie mogę wymyślić żadnego sposobu, aby zareagować na proces zaczynający nasłuchiwać gniazda (co uniknęłoby podejścia odpytywania) bez użycia ptrace
.
nc -w 2 </dev/null >/dev/null
- jeśli połączenie trwa dłużej niż 2 sekundy, upłynie limit czasu i nie powiedzie się - co jest przydatne do mojego użycia.nc -q 1 localhost 13000 </dev/null
zwraca natychmiast, jeśli żaden serwer nie nasłuchuje, ale zwraca kod błędu, więc pętla uśpia i próbuje ponownie kilka sekund później.Jeśli masz bash i coreutils (np. Limit czasu, sen), ale nie masz nc / lsof / netstat, możesz użyć tego rozwiązania, które wykorzystuje gniazda bash magic tcp:
źródło
Podobnie jak w poprzednim przykładzie z
bash
magicznymi gniazdami Tcp, tutaj jest ulepszona wersja, która czeka na połączenie przez ograniczony czas.Różnica polega na tym, że jeśli połączenie nie było dostępne podczas
15s
, - nie zapętla się na zawsze, ale kończy działanie z kodem błędu.Jest to przydatne w skryptach init do oczekiwania na gotowość / dostępność usługi po uruchomieniu.
źródło