web-dev-qa-db-ja.com

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

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

Linuxでそれを行うものはありますか?

while (checkAlive -Host localhost -port 13000 == false)
  do some waiting

...
33
Will

サーバーが接続を受け入れているかどうかを確認する最良のテストは、実際に接続を試すことです。サーバーが話すプロトコルには通常のクライアントを使用し、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
17
kanaka

前の例bash tcpソケットマジックを使用して、限られた時間内に接続を待機する拡張バージョンを次に示します。

timeout 15 bash -c 'until echo > /dev/tcp/localhost/13000; do sleep 0.5; done'

違いは、接続が15s、-永久にループしませんが、エラーコードで終了します。

これは、起動後にサービスの準備/可用性を待機するinitスクリプトで役立ちます。

9
arma