自分用メモ。
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通信できるというものがある。
これを応用すると、ポートの準備ができるまで待つという操作をシェルスクリプトとして書ける:
while ! >/dev/tcp/localhost/${PORT}; do sleep 3; done
while ! > ...
となっているのが異質だが、これは実質while ! : > ...
と同じだ(あまり自信がない)。書き込みオープンできるかどうかを確認しているという感じである。
ぜんぜんわかんなかったのでStack Overflowで訊いた:
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