シェル / CI: 終わらないかもしれないコマンドは timeout で包む(時間切れは終了コード 124)
GNU coreutils の timeout を前に付けると、指定時間を過ぎたコマンドを止められる。時間切れのときの終了コードは 124 なので、普通の失敗と区別できる。
使う場面
ネットワーク待ちで固まるスクリプト、まれにハングするテスト、外部 API を叩く処理など。CI のジョブ全体のタイムアウト(GitHub Actions は既定で6時間)を待たずに、その手順だけを早めに失敗させられる。
やり方
bash
timeout 60 ./slow.sh # 60 秒で SIGTERM を送って止める
timeout 5m npm test # s / m / h / d の単位が使える
# SIGTERM で止まらないプロセスには、さらに 10 秒後に SIGKILL
timeout -k 10s 2m ./flaky-server-test.sh
# 時間切れかどうかで分岐する
timeout 30 curl -fsS https://example.com/health
status=$?
if [ "$status" -eq 124 ]; then
echo "タイムアウトしました" >&2
fi- 時間切れなら 124。コマンド自体が先に終わったときは、そのコマンドの終了コードがそのまま返る。
--preserve-statusを付けると、時間切れでも 124 ではなく、シグナルで止まったコマンドの終了コードを返す。
注意点
- macOS には標準で入っていない。Homebrew の
coreutilsを入れるとgtimeoutという名前で使える(PATH の設定次第でtimeout)。 timeoutはシェル組み込みではなく外部コマンドなので、シェル関数やエイリアスはそのまま包めない。timeout 10 bash -c '...'の形にする。- GitHub Actions なら、ステップ単位の
timeout-minutes:でも同じことができる。手順の一部だけ止めたいときにtimeoutを使う。
出典
- @tane_log · 2026-10-27
- GNU coreutils マニュアル
timeout: gnu.org