回答:
サーバーが接続を受け入れているかどうかを確認する最良のテストは、実際に接続を試みることです。サーバーが話すプロトコルには通常のクライアントを使用し、no-opコマンドを試してください。
シェルから簡単にドライブできる軽量のTCPまたはUDPクライアントが必要な場合は、netcatを使用します。会話をプログラムする方法は、プロトコルによって異なります。多くのプロトコルでは、サーバーが特定の入力で接続を閉じ、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
ます)。
nc -w 2 </dev/null >/dev/null
接続に2秒以上かかるとタイムアウトして失敗するスクリプトを使用していますが、これは使用に便利です。
nc -q 1 localhost 13000 </dev/null
は、リッスンしているサーバーがない場合はすぐに戻りますが、エラーコードを返します。そのため、ループによりスリープ状態になり、数秒後に再試行されます。
bashとcoreutils(タイムアウト、スリープなど)があり、nc / lsof / netstatはない場合、bashマジックtcpソケットを使用するこのソリューションを使用できます。
while ! timeout 1 bash -c "echo > /dev/tcp/localhost/13000"; do sleep 10; done