概要
- Bashスクリプト でWebサーバー起動後の 状態確認 の問題点
- until ループの無限待機リスク
- timeoutコマンド の利用方法と制約
- until とtimeoutの組み合わせ時の注意点
- Bashプロセスや別スクリプト での解決策
BashスクリプトでのWebサーバー起動待機と無限ループ問題
- Webサーバー起動確認 のためにBashスクリプトで until ループを使用
- 例:
until curl --silent --fail-with-body 10.0.0.1:8080/health; do sleep 1; done - サーバーが起動失敗 した場合、ループが 永久に継続 するリスク
- sleep 1 が永遠に実行される状況発生
timeoutコマンドの活用法
- timeout はコマンド実行に 制限時間 を設定するユーティリティ
- 指定時間を超えると SIGTERM シグナルで強制終了
- シグナルは --signal オプションで変更可能(例:
timeout --signal=SIGKILL 1s foo) - 例:
timeout 1s sleep 5→ 1秒後にsleepへSIGTERM送信、終了コード124返却
untilとtimeoutの直接併用の課題
- 直感的には
timeout 1m until curl ...; do sleep 1; doneのように書きたくなる - しかし timeout は kill可能なコマンド を前提としており、 untilはシェルキーワード のため直接利用不可
- timeout はシェル組み込みコマンドやキーワードには利用できない制約
解決策:Bashプロセスや外部スクリプトでラップ
- until ループ全体を bash -c でラップし、timeoutの引数として渡す方法
- 例:
timeout 1m bash -c "until curl --silent --fail-with-body 10.0.0.1:8080/health; do sleep 1; done"
- 例:
- または untilループを外部スクリプト (例:until.sh)に分離し、
timeout 1m ./until.shのように実行
まとめと注意点
- timeout はシェル組み込みには直接使えない制約
- bash -c や 外部スクリプト でラップすることで 実用的にtimeoutを活用可能
- 無限ループ防止 や 障害時の自動停止 として有効なテクニック