Replies: 2 comments 1 reply
|
The message narrows it down. "The runner has received a shutdown signal" is written only when the runner's own shutdown token fires with reason Exit 143 is the step, not npm: on cancel the runner sends your step SIGINT, waits 7.5 s, then SIGTERM (ProcessInvoker.cs L32-L33), and 128+15 is bash reporting the SIGTERM. Two things you can do. Set the repository variable On billing: the docs describe blocking usage before a job starts; I found nothing about stopping a running job and could not confirm it either way. Retry the run. If it dies again on the same step, the run URL plus that streamed log is what Support needs. |
|
Sagargupta16's analysis of the runner source explains the "why" well. Here is a bit more on your remaining questions. What can trigger a shutdown signal mid-job? As noted above, that message means the runner process itself was told to stop, not that the job was cancelled or timed out. On a GitHub-hosted VM that has to come from the platform side (host maintenance, an infrastructure interruption, or the service tearing down the runner). Users can't see which one it was. OOM is an unlikely cause, since the kernel OOM killer sends SIGKILL, which normally shows up as exit 137 or a "lost communication" error rather than a graceful shutdown message. Telling the cases apart From the user side you can mostly go by the message and the final conclusion:
Distinguishing control-plane termination from an infrastructure interruption isn't possible from your logs. Only GitHub Support can see that. Billing I can't confirm this either way. The docs describe billing limits blocking jobs from starting, but I haven't found anything saying a running job gets stopped. It is worth checking your Billing page for spending-limit or quota alerts around that timestamp. Preserving evidence Anything that depends on a later step (artifact upload, ( while true; do
echo "=== $(date -u +%T) ==="
free -m | sed -n 2p
df -h / | tail -1
docker stats --no-stream 2>/dev/null
sleep 5
done ) &
trap 'echo "SIGTERM at $(date -u +%T)"; uptime; ps aux --sort=-%mem | head -5; sudo dmesg | tail -20' TERM INTThe trap may not finish before teardown, but even a timestamp showing when the signal arrived is useful. I would also enable Next step Re-run with the monitoring in place. If it fails again at the same step, open a GitHub Support ticket with the run URL, job ID, runner name, and UTC timestamps. A single occurrence is most likely platform-side, but a failure that repeats at Hope this helps. |
Uh oh!
There was an error while loading. Please reload this page.
🏷️ Discussion Type
Question
💬 Feature/Topic Area
Actions Runner
Discussion Details
Hello GitHub Community,
I'm investigating an unexpected shutdown of a GitHub-hosted Ubuntu runner during an active GitHub Actions job.
Environment
ubuntu-24.042.338.020261012.334.1workflow_dispatchcancel-in-progress: falseWhat happened
The workflow successfully reached a Docker container execution stage and started
npm ci --offline.Approximately 10 seconds after npm started, the job reported:
The exit code 143 belongs to the host workflow step. No npm exit code was captured.
The last available container heartbeat showed no OOM kill, but the final container state could not be verified.
The job concluded as
failure, notcancelled.A subsequent artifact-upload step configured with
if: always()was skipped.What I investigated
I reviewed GitHub Actions Runner v2.338.0 source code and found that runner shutdown can bypass step-condition evaluation, explaining why an
always()step may be skipped.However, this does not identify what initiated the shutdown.
The job had not reached its configured timeouts, and I found no evidence of a competing workflow cancellation.
Questions
I have not retried the workflow because I would first like to understand the possible causes and the appropriate diagnostic approach.
Any guidance from the community would be appreciated. Thank you!
All reactions