テック技報最新号へ →
コード

シェル / CI: 終わらないかもしれないコマンドは timeout で包む(時間切れは終了コード 124)

GNU coreutils の timeout を前に付けると、指定時間を過ぎたコマンドを止められる。時間切れのときの終了コードは 124 なので、普通の失敗と区別できる。

@tane_log · 投稿 2026-10-27
#shell#ci#github-actions

使う場面

ネットワーク待ちで固まるスクリプト、まれにハングするテスト、外部 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 を使う。

出典

X の元の投稿を開く