web-dev-qa-db-ja.com

netcatでオープンポートを待つ方法は?

私はジェンキンを使用してカスタムdockerfileを実行しようとしています。 netcatでい「スリープ60」を行う代わりに、ポート8080が開くまで待ちますが、bashスクリプトとnetcatにはあまり自信がありません。

ここに私がやろうとしていることの例があります:

#!/bin/bash

opened=0

while [ "$opened"  == "0" ]; do
  echo "Waiting jenkins to launch on 8080..."
  nc -vz localhost 8080
done

echo "Jenkins launched"
41
FXG

いくつかのポートが開くまで待機するようにnetcatを設定することはできません。そのため、次のチェックが行われる前に待機する部分を追加する必要があります。これを試して:

#!/bin/bash

echo "Waiting jenkins to launch on 8080..."

while ! nc -z localhost 8080; do   
  sleep 0.1 # wait for 1/10 of the second before check again
done

echo "Jenkins launched"
82
user987339

次のライナーをお勧めします:

## netcat version:
timeout 22 sh -c 'until nc -z $0 $1; do sleep 1; done' stackoverflow.com 443

## pure bash version:
timeout 22 bash -c 'until printf "" 2>>/dev/null >>/dev/tcp/$0/$1; do sleep 1; done' stackoverflow.com 443

接続が確立されるとすぐに両方のコマンドが終了し、1秒ごとに最大22秒間試行します。

timeoutコマンドの終了コードは0ポートにアクセス可能な場合、そうでない場合は124(指定された時間内に接続が確立されなかった場合)。

13
Onlyjob

here のように、ncがインストールされておらず、bashcoreutilsだけがインストールされている場合は、次のこともできます。

#!/bin/bash

echo "Waiting jenkins to launch on 8080..."

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

echo "Jenkins launched"
9
Anthony O.

これは、オプションのタイムアウトを使用して、ポートが開くのを待つユーティリティを作成するのに十分な一般的な問題であることがわかりました。

# without timeout
wait-port localhost:8080

# timeout after a minute
wait-port -t 60000 localhost:8080

これはオープンソースで、 github.com/dwmkerr/wait-port で入手できます。うまくいけば、他の人が役に立つと思います!

6
Dave Kerr

User987339の答えを拡張するために、ターミナルのポートを簡単に待つ方法を次に示します。

ウェイトポート機能

〜/ .bashrcセットアップファイルにこの関数を追加します。

waitport() {
    while ! nc -z localhost $1 ; do sleep 1 ; done
}

ログアウトしてから再度ログインし、〜/ .bashrcをロードします。次に、次のコマンドを実行して、ポート3000がサーバーをリッスンしていることを確認します。

$ waitport 3000
Connection to localhost port 3000 [tcp/hbci] succeeded!

これはmacOSで検証されています。 netcat-zオプションがないため、Fedora/CentOSでは動作しない可能性があります。

0
johntellsall