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


33

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

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

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

...

回答:


52

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


netcatが答えだと思うので、ありがとう。明確にするために、私がやろうとしているのは、負荷分散手順の一部としてスクリプトを書くことです。プロセスを開始し、ポートでリクエストを受け入れるまで待ってから、元のプロセスをシャットダウンする必要があります。自分のスクリプトを書くよりも、これを行うためのより良い方法があれば、私はすべて耳にします。
ウィル

@ウィル:それは非常に異なる質問です!別の答えを書きました。
ジル 'SO-悪であるのをやめる'

1
私もnetcatソリューションが好きです。nc -w 2 </dev/null >/dev/null接続に2秒以上かかるとタイムアウトして失敗するスクリプトを使用していますが、これは使用に便利です。
一時的な

参考までに、「while nc -q 1 localhost 13000 </ dev / null; 10寝る。完了しました。すぐに戻ります。ただし、最初のものは問題なく動作します。ありがとう!
エリスパーシバル

@Flyte nc -q 1 localhost 13000 </dev/nullは、リッスンしているサーバーがない場合はすぐに戻りますが、エラーコードを返します。そのため、ループによりスリープ状態になり、数秒後に再試行されます。
ジル 'SO-悪であるのをやめる'

17

bashとcoreutils(タイムアウト、スリープなど)があり、nc / lsof / netstatはない場合、bashマジックtcpソケットを使用するこのソリューションを使用できます。

while ! timeout 1 bash -c "echo > /dev/tcp/localhost/13000"; do sleep 10; done

-詳述すると、バッシュは、「ネットワークのリダイレクト」を使用してTCPソケットに接続するオプション機能があるgnu.org/software/bash/manual/html_node/...
johntellsall

7

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

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

違いは、接続中に接続が利用できなかった場合15s、永遠にループするのではなく、エラーコードで終了することです。

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.