Risposte:
Il miglior test per vedere se un server accetta connessioni è in realtà provare a connettersi. Usa un client normale per qualunque protocollo parli il tuo server e prova un comando no-op.
Se si desidera un client TCP o UDP leggero, è possibile guidare semplicemente dalla shell, utilizzare netcat . Come programmare una conversazione dipende dal protocollo; molti protocolli prevedono che il server chiuda la connessione su un determinato input e quindi netcat uscirà.
while ! echo exit | nc localhost 13000; do sleep 10; done
Puoi anche dire a netcat di uscire dopo aver stabilito la connessione. Restituisce 1 se non è presente alcuna connessione e 0 se è presente, quindi neghiamo il suo output. A seconda della versione di netcat, potrebbe supportare uno o entrambi i seguenti comandi:
while ! nc -z localhost 13000 </dev/null; do sleep 10; done
while ! nc -q 1 localhost 13000 </dev/null; do sleep 10; done
Un approccio alternativo è attendere che il processo del server apra un socket di ascolto.
while netstat -lnt | awk '$4 ~ /:13000$/ {exit 1}'; do sleep 10; done
Se sei su Mac OS, netstat utilizza un formato di output leggermente diverso, quindi vorrai il seguente intead:
while netstat -lnt | awk '$4 ~ /\.13000$/ {exit 1}'; do sleep 10; done
Oppure potresti voler scegliere come target un ID processo specifico:
while ! lsof -n -Fn -p $pid | grep -q '^n.*:13000$'; do sleep 10; done
Non riesco a pensare a nessun modo di reagire al processo iniziando ad ascoltare il socket (che eviterebbe un approccio di polling) a corto di utilizzo ptrace
.
nc -w 2 </dev/null >/dev/null
- se la connessione richiede più di 2 secondi, scade e fallisce - il che è utile per il mio utilizzo.
nc -q 1 localhost 13000 </dev/null
ritorna immediatamente se nessun server è in ascolto, ma ritorna con un codice di errore, quindi il loop lo fa dormire e riprovare qualche secondo dopo.
Se hai bash e coreutils (es. Timeout, sleep), ma non nc / lsof / netstat, puoi usare questa soluzione che usa i socket bash magic tcp:
while ! timeout 1 bash -c "echo > /dev/tcp/localhost/13000"; do sleep 10; done
Seguendo l' esempio precedente con bash
tcp sockets magic, ecco una versione avanzata che attende la connessione per un periodo di tempo limitato.
timeout 15 bash -c 'until echo > /dev/tcp/localhost/13000; do sleep 0.5; done'
La differenza è che se la connessione non era disponibile durante 15s
, - non si ripeterà per sempre ma uscirà con il codice di errore.
Ciò è utile negli script init per attendere la disponibilità / disponibilità del servizio dopo l'avvio.