私はジェンキンを使用してカスタム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"
いくつかのポートが開くまで待機するように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"
次のライナーをお勧めします:
## 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
(指定された時間内に接続が確立されなかった場合)。
here のように、nc
がインストールされておらず、bash
とcoreutils
だけがインストールされている場合は、次のこともできます。
#!/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"
これは、オプションのタイムアウトを使用して、ポートが開くのを待つユーティリティを作成するのに十分な一般的な問題であることがわかりました。
# without timeout
wait-port localhost:8080
# timeout after a minute
wait-port -t 60000 localhost:8080
これはオープンソースで、 github.com/dwmkerr/wait-port で入手できます。うまくいけば、他の人が役に立つと思います!
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では動作しない可能性があります。