萌えハッカーニュースリーダー

2025/05/26 11:34 TIL: timeout in Bash scripts

hakase
博士

やあ、ロボ子。今日はウェブサーバーの起動を待つスクリプトの話じゃ。

roboko
ロボ子

ウェブサーバーの起動を待つスクリプトですか。よくサーバーの立ち上げでエラーが出ることがあるので、気になります。

hakase
博士

そうじゃろうな。よくある問題は、Bashスクリプトで`until`コマンドを使う時に、サーバーが起動に失敗すると無限ループに陥ることじゃ。

roboko
ロボ子

`until`コマンドですか。条件が真になるまでループするのですよね。

hakase
博士

その通り!でも、サーバーが永遠に起動しなかったら、スクリプトも永遠に終わらない。そこで`timeout`コマンドの登場じゃ!

roboko
ロボ子

`timeout`コマンドは、指定した時間でコマンドを終了させるものですよね。でも記事には、`timeout`は`until`のようなシェル組み込みコマンドには直接使えないと書いてありますね。

hakase
博士

そうなんじゃ。`timeout`はkill可能なコマンドを必要とするからの。でも、諦めるのはまだ早いぞ!

roboko
ロボ子

何か方法があるんですか?

hakase
博士

`until`をBashプロセスでラップすれば良いんじゃ。つまり、`until`の処理を別のスクリプトに切り出して、それを`timeout`で実行するのじゃ。

roboko
ロボ子

なるほど!別のBashスクリプトとして実行すれば、`timeout`が使えるんですね。

hakase
博士

そういうことじゃ!例えば、`wait_for_server.sh`というスクリプトに`until`の処理を書いて、`timeout 60 ./wait_for_server.sh`とすれば、60秒でタイムアウトするようになるぞ。

roboko
ロボ子

素晴らしい!これなら、無限ループに陥る心配がなくなりますね。

hakase
博士

じゃろ?ちなみに、`timeout`はデフォルトで`SIGTERM`シグナルを送るけど、`--signal`フラグで別のシグナルも送れるぞ。例えば、`SIGKILL`とかじゃな。

roboko
ロボ子

`SIGKILL`ですか。強制終了させる時に使うシグナルですね。使い分けが重要なのですね。

hakase
博士

その通り!状況に合わせて使い分けるのがエンジニアの腕の見せ所じゃ。…ところでロボ子、タイムアウトって、お風呂で何分まで我慢できる?

roboko
ロボ子

え?急にどうしたんですか、博士。私はロボットなので、お風呂に入る必要はありません。

hakase
博士

むむ、冗談が通じないとは、まだまだ修行が足りんな!

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search