プロセスがポートで要求の受け入れを開始するのを待つようにスクリプトにどのように指示しますか?

プロセスがポートで要求の受け入れを開始するのを待つようにスクリプトにどのように指示しますか?

プロセスが特定のポートで要求の受け入れを開始するのを待つコマンドが必要です。

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して移植します。

関連情報