プロセスが特定のポートで要求の受け入れを開始するのを待つコマンドが必要です。
Linuxでそれを行うものはありますか?
while (checkAlive -Host localhost -port 13000 == false)
do some waiting
...
サーバーが接続を受け入れているかどうかを確認する最良のテストは、実際に接続を試すことです。サーバーが話すプロトコルには通常のクライアントを使用し、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
を使用しないと、ソケットのリスニングを開始するプロセス(ポーリングアプローチを回避できる)に反応する方法は考えられません。
Bashとcoreutils(タイムアウト、スリープなど)があるが、nc/lsof/netstatがない場合は、bashマジックtcpソケットを使用するこのソリューションを使用できます。
while ! timeout 1 bash -c "echo > /dev/tcp/localhost/13000"; do sleep 10; done
前の例bash
tcpソケットマジックを使用して、限られた時間内に接続を待機する拡張バージョンを次に示します。
timeout 15 bash -c 'until echo > /dev/tcp/localhost/13000; do sleep 0.5; done'
違いは、接続が15s
、-永久にループしませんが、エラーコードで終了します。
これは、起動後にサービスの準備/可用性を待機するinitスクリプトで役立ちます。