GitHub Actions:「The runner has received a shutdown signal」
ジョブを動かしていたマシンが止まるよう合図を受け、動いていたステップを止めてジョブを手放した、という意味です(「ランナーが停止の合図を受け取った」)。ステップが自分で失敗したのではありません。GitHub のホストのランナーではメモリが尽きかけたとき、セルフホストのランナーではランナーのサービスが止められたり再起動されたりしたときに出ます。
見え方
2026年11月2日の公開のジョブ(runs-on: ubuntu-latest)のログの最後の行です:
##[error]Process completed with exit code 143. ##[error]The runner has received a shutdown signal. This can happen when the runner service is stopped, or a manually started runner is canceled.
- ジョブは失敗になります。注釈には「Process completed with exit code 143.」や「The operation was canceled.」しか出ないことがあり、後者は時間切れでも出るので、ログで停止の行を探してください(chdb-core #309)。
- 終了コード143は 128 + 15 で、ステップのプロセスが SIGTERM で終わらされたことを示します。
- 後ろのステップは、
if: always()のものも動きません。そのジョブでは、if: always()のまとめのステップも後処理(Post)のステップも飛ばされました(funcd #1362)。残したいものは、そのステップの中で書き出しておく必要があります。 - 出力は、失敗したテストも無く途切れることがよくあります。あるプロジェクトでは、テストは全部通っていて、結果の行が出る前の0.5秒ほどでランナーが止まりました(brighterscript-game-engine #429)。
GitHub のホストのランナー:たいていメモリ
標準の Linux と Windows のランナーのメモリは、公開のリポジトリで16 GB、非公開で8 GB です。ubuntu-slim は5 GB、arm64 の macOS のランナーは7 GB です(2026年11月3日の GitHub のランナーの文書)。2026年10月末から11月の報告:
- あるプロジェクトが30秒ごとにメモリを測ると、使える量が14,163 MB から約2,300 MB まで減り、3 GB のスワップが埋まり、テストのバイナリの1つが11 GB に達して、最後の測定の19秒後にランナーが停止の合図を受けました。カーネルのログにメモリ不足での強制終了はありませんでした。原因は、作ったものを片付けないテストでした(funcd #1362)。
- 別のプロジェクトでは、11月1日からの失敗したテストのシャード23本のうち14本がこの形で、どれも10〜13分のところで止まっていました。約9〜11 GB のコンパイラのプロセス2つが、16 GB のランナーの上で重なっていました(ripr-swarm #12703)。
- 3つ目は、16 GB のランナーの上の約14 GB の
-raceのテストのバイナリでした(conduit #3311)。 - ホストのランナーがジョブの途中で横取り(preempt)されることがあるとして、その実行だけを再実行するプロジェクトもあります(campus-erp #49)。
同じ負荷が、代わりに「The hosted runner lost communication with the server」で終わることもあり、そのときはログも残らないことがあります(funcd #1362)。
セルフホストのランナー:ランナーのサービスが止まった
メッセージのとおり、ランナーのサービスが止められたか、手で起動したランナー(./run.sh)がキャンセルされたときに出ます。ジョブの途中でサービスを止めたり再起動したりするものは、どれも同じ結果になります。chdb-core #309 では、ランナーのマシンで UTC の6時に自動の更新が走ってランナーのサービスを再起動し、そのとき動いていたビルドが止まりました。あるプルリクのビルドは4本とも6時4分〜22分に、ある夜のビルドは4本のうち3本です。直す場所はマシンの側で、使い捨て(ephemeral)のランナーにするか、ジョブが動きうる間は再起動しないようにします。
どうするか
- ステップの中でメモリを測り、ランナーが止まる前に数字をログに出す:
- name: Test run: | (while true; do echo "mem $(date -u +%T) $(free -m | awk 'NR==2 {print $7}') MB available"; sleep 30; done) & sampler=$! trap 'kill $sampler' EXIT make test - 山を低くする:メモリを多く使うパッケージを1つずつビルドやテストする(ripr-swarm・conduit)、並ぶコンパイラやテストのプロセスを減らす(
cargo build -j 2・go test -p 1)、ジョブをもっと多くのシャードに分ける。 - テストが返さないメモリを探す:funcd #1362 では、8本のテストが作ったものを片付けず、
-count=5の5回のたびに使用中のメモリが約1.8 GB ずつ増えていました。 - メモリの多いランナーを使う:大きなランナー(有料・GitHub Team か Enterprise Cloud)か、セルフホストのランナー。
- 再実行:Re-run failed jobs、または
gh run rerun <run-id> --failed。GitHub Actions にはランナーを失ったときの再試行の設定が無いので、失敗したジョブ全部のログに停止の行があるときだけ、1回目の実行に限って自動で再実行するプロジェクトがあります(campus-erp #49・chdb-core #309)。既定のブランチに置くワークフローの例:
on:
workflow_run:
workflows: [CI]
types: [completed]
permissions:
actions: write
jobs:
rerun:
if: github.event.workflow_run.conclusion == 'failure' && github.event.workflow_run.run_attempt == 1
runs-on: ubuntu-latest
steps:
- env:
GH_TOKEN: ${{ github.token }}
REPO: ${{ github.repository }}
RUN: ${{ github.event.workflow_run.id }}
run: |
for id in $(gh api "repos/$REPO/actions/runs/$RUN/jobs?per_page=100" --jq '.jobs[] | select(.conclusion == "failure") | .id'); do
gh api "repos/$REPO/actions/jobs/$id/logs" > job.log || exit 0
grep -q "The runner has received a shutdown signal" job.log || exit 0
done
gh run rerun "$RUN" --failed --repo "$REPO"
見分け方
- ジョブの時間の上限:ジョブは Cancelled で終わり、「The job has exceeded the maximum execution time」が出ます(どうするか)。
- どのランナーもジョブを受け取らなかった:ステップが1つもありません(「The job was not acquired by Runner of type hosted」)。
- アカウントの支払い:ジョブはステップ無しで数秒で失敗します(「recent account payments have failed」)。
ランナーを失ったジョブを IntelliJ IDEA から見るなら
Pipeline Inbox for GitHub Actions Workflows は、Lesstep が作っている JetBrains IDE(2024.1 以降)のプラグインです。すべてのリポジトリの実行を、ジョブ・ステップと一緒に IDE のツールウィンドウに並べるので、通ったジョブの横で、失敗したジョブが目立ちます。いまのブランチの実行はステータスバーに出ます。読むのは無料、失敗したジョブの再実行・キャンセル・ワークフローの実行・デプロイのレビューは Pro(月 US$1.50・30日の無料試用つき)です。
GitHub と GitHub Actions は GitHub, Inc. の商標、IntelliJ IDEA は JetBrains s.r.o. の商標です。このページは GitHub, Inc.・JetBrains のいずれとも提携しておらず、承認も受けていません。
ほかに:「The job has exceeded the maximum execution time」 · 「The job was not acquired by Runner of type hosted」 · デバッグログ付きでジョブを再実行する · IntelliJ IDEA で使える GitHub Actions のプラグインの比較 · English