Jawaban:
Tes terbaik untuk melihat apakah server menerima koneksi adalah dengan benar-benar mencoba menghubungkan. Gunakan klien biasa untuk protokol apa pun yang dibicarakan oleh server Anda dan coba perintah no-op.
Jika Anda menginginkan klien TCP atau UDP yang ringan, Anda dapat mengemudi hanya dari shell, gunakan netcat . Cara memprogram percakapan tergantung pada protokol; banyak protokol yang membuat server menutup koneksi pada input tertentu, dan netcat kemudian akan keluar.
while ! echo exit | nc localhost 13000; do sleep 10; done
Anda juga dapat memberitahu netcat untuk keluar setelah membuat koneksi. Ini mengembalikan 1 jika tidak ada koneksi dan 0 jika ada jadi kami meniadakan outputnya. Bergantung pada versi netcat Anda, itu mungkin mendukung satu atau kedua perintah berikut:
while ! nc -z localhost 13000 </dev/null; do sleep 10; done
while ! nc -q 1 localhost 13000 </dev/null; do sleep 10; done
Pendekatan alternatif adalah menunggu proses server untuk membuka soket pendengaran.
while netstat -lnt | awk '$4 ~ /:13000$/ {exit 1}'; do sleep 10; done
Jika Anda menggunakan Mac OS, netstat menggunakan format output yang sedikit berbeda, jadi Anda ingin yang berikut:
while netstat -lnt | awk '$4 ~ /\.13000$/ {exit 1}'; do sleep 10; done
Atau Anda mungkin ingin menargetkan ID proses tertentu:
while ! lsof -n -Fn -p $pid | grep -q '^n.*:13000$'; do sleep 10; done
Saya tidak bisa memikirkan cara untuk bereaksi terhadap proses mulai mendengarkan soket (yang akan menghindari pendekatan polling) singkat menggunakan ptrace
.
nc -w 2 </dev/null >/dev/null
- jika koneksi membutuhkan waktu lebih dari 2 detik, itu mati dan gagal - yang berguna untuk penggunaan saya.
nc -q 1 localhost 13000 </dev/null
segera kembali jika tidak ada server yang mendengarkan, tetapi ia kembali dengan kode kesalahan, sehingga loop membuatnya tidur dan coba lagi beberapa detik kemudian.
Jika Anda memiliki bash dan coreutils (mis. Batas waktu, tidur), tetapi tidak nc / lsof / netstat, Anda dapat menggunakan solusi ini yang menggunakan soket bash magic tcp:
while ! timeout 1 bash -c "echo > /dev/tcp/localhost/13000"; do sleep 10; done
Mengikuti contoh sebelumnya dengan bash
tcp sockets magic, berikut adalah versi yang disempurnakan yang menunggu koneksi selama waktu terbatas.
timeout 15 bash -c 'until echo > /dev/tcp/localhost/13000; do sleep 0.5; done'
Perbedaannya adalah bahwa jika koneksi tidak tersedia selama 15s
, - itu tidak akan berulang tetapi keluar dengan kode kesalahan.
Ini berguna dalam skrip init untuk menunggu kesiapan / ketersediaan layanan setelah startup.