プロセスが特定のポートで要求の受け入れを開始するのを待つコマンドが必要です。
Linuxにこのようなことができるものはありますか?
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
して移植します。