Lambdaカクテル

京都在住Webエンジニアの日記です

Invite link for Scalaわいわいランド

あるサーバ(MySQL、任意のTCPサーバ)が起動しているかシェルスクリプトから確認し、起動するまで待つ作法

自分用メモ。

MySQLが起動するまで待つ

mysqladminコマンドにはpingというサブコマンドがあるので、これを利用すれば起動するまで待つ処理を書くことができる:

until mysqladmin ping -u "$MYSQL_USER" -h "$HOST" --silent; do
  echo "waiting for MySQL to start ..."
  sleep 1
done

任意のTCPサーバがlistenするまで待つ(bash)

Bashの拡張機能として、 /dev/tcp/$HOST/$PORTにリダイレクトするとTCP通信できるというものがある。

www.gnu.org

これを応用すると、ポートの準備ができるまで待つという操作をシェルスクリプトとして書ける:

while ! >/dev/tcp/localhost/${PORT}; do sleep 3; done

while ! > ...となっているのが異質だが、これは実質while ! : > ...と同じだ(あまり自信がない)。書き込みオープンできるかどうかを確認しているという感じである。

ぜんぜんわかんなかったのでStack Overflowで訊いた:

stackoverflow.com

Bashの実行モデルとして、まず最初にリダイレクトが設定されてからコマンドが実行される(そうしなければプロセスにファイルディスクリプタを渡すことができない)のだが、でもコマンドはないので何も起こらないよ、という旨の説明を得ることができた。何もしないコマンドとしてbashは:を用意しているので、これは以下の記述と同等になるらしい:

while ! : >/dev/tcp/localhost/${PORT}; do sleep 3; done

bashに関する思わぬ学びが得られたので良かった。

任意のTCPサーバがlistenするまで待つ(zsh)

zshであれば同じような機構がzsh/net/tcpモジュールによって提供されているので、zmodloadを使ってから呼び出せばよい:

zmodload zsh/net/tcp
until ztcp example.com 80 && ztcp -c; do
  echo "waiting for tcp..."
  sleep 1
done

man.archlinux.org

★記事をRTしてもらえると喜びます
Webアプリケーション開発関連の記事を投稿しています.読者になってみませんか?