"The runner has received a shutdown signal": the cause, and a runner with the memory to fix it
Your job died with "The runner has received a shutdown signal" and no exit code. On a GitHub-hosted runner the cause GitHub's maintainers confirmed is memory: ubuntu-latest has 8 GB on a private repository, and once it is gone the VM stops before any out-of-memory line reaches the log. Every retry burns minutes and blocks the merge.
Skipbox gives the job the memory it needs at a flat price: runs-on: skipbox for 16 GB at $39 a month, or skipbox-16x32 for 32 GB at $149, with unlimited minutes.
What the message means
The runner application logs it when its process is told to stop during a job: "The runner has received a shutdown signal. This can happen when the runner service is stopped, or a manually started runner is canceled." The step then ends with "The operation was canceled." and no exit code, because none of your commands failed.
| What the log shows | What happened |
|---|---|
| The shutdown line, no exit code, nobody cancelled the run | The VM ran out of memory and went down |
Process completed with exit code 137. | The kernel killed one process for memory; the runner survived |
| The shutdown line, and the run page says it was cancelled | A newer run, a person or a timeout ended it |
In actions/runner-images issue #15202, a GitHub maintainer reproduced it on an 8 GB ubuntu-24.04 runner: jobs under memory plus swap passed, jobs above it lost the runner with this exact message. A new image can trigger it with no change on your side, when a new default tool version needs more memory than the old one.
What it costs to stay at 8 GB
Each lost run is minutes billed for nothing, a re-run, and a pull request that can't merge. Working around it is work too:
- lowering test workers,
make -jor Gradle's worker count, so the job runs slower - capping Node's
--max-old-space-sizeor the JVM's-Xmx - splitting one job into several and wiring them back together
- pinning a tool version until someone finds time to fix it
The memory need only grows: bigger test suites, bigger builds, more jobs from coding agents pushing fixes. GitHub's answer is a larger runner, billed every minute:
| Memory | GitHub runner with it | At 20,000 minutes a month | Skipbox | Per month, unlimited minutes |
|---|---|---|---|---|
| 16 GB | 4-core larger runner, $0.012 a minute | $222 | skipbox, plan S | $39 |
| 32 GB | 8-core larger runner, $0.022 a minute | $422 | skipbox-16x32, plan L | $149 |
GitHub's figures are on GitHub Team, after its included compute; larger runners need Team or Enterprise Cloud. Check your own minutes in the calculator on the home page.
A self-hosted runner of your own costs nothing on GitHub's bill, but it shows the same message whenever its service restarts, the host reboots for patches or an autoscaler pulls the machine. Running one well is servers, patching, cleanup and scaling.
Skipbox fixes it
The memory, at a flat price
runs-on | Machine | Plan, per month |
|---|---|---|
skipbox | 4 vCPU, 16 GB | S, $39 |
skipbox-8x16 | 8 vCPU, 16 GB | M, $79 |
skipbox-16x32 | 16 vCPU, 32 GB | L, $149 |
Minutes are unlimited. Skipbox registers as a self-hosted runner, so its jobs use none of your GitHub minutes and don't stop at an Actions budget. Jobs beyond your plan's machines wait their turn.
Faster reruns
Each plan is a VM kept for your account. Docker images, layers and build cache, package caches and the tool cache stay on its disk, so the next run starts with them instead of downloading everything again.
A machine you don't babysit
Skipbox keeps the image updated, wipes each job's credentials, processes and containers (the checkout and Cargo's target/ stay from 13 November 2026), health-checks the machine after every job and rebuilds one that fails. The VMs run Ubuntu 24.04 with Docker, Node.js and Python.
Moving is one line
jobs:
build:
runs-on: skipbox # was ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: npm ci && npm test
- Sign in to Skipbox with GitHub.
- Install the Skipbox GitHub App and pick the repositories.
- Change
runs-onand push.
skipbox runs on every plan, skipbox-16x32 on plan L. To move back, change the line back.
Try it on your own jobs
The trial is free for 7 days or 3,000 job-minutes, whichever comes first, with no card. It runs runs-on: skipbox jobs at 4 vCPU and 16 GB, 2× the memory of a private repository's ubuntu-latest, so move the job that runs out of memory and see it run with its caches kept, then take plan L for a job that needs more.
FAQ
What does "The runner has received a shutdown signal" mean?
The runner application was told to stop while your job was running. On a GitHub-hosted runner you didn't stop anything: the VM under the job went away, most often because the job used all of its memory. Skipbox's skipbox and skipbox-16x32 give a job 16 or 32 GB at a flat monthly price.
Why does my job get cancelled with no error?
When the log ends with the shutdown line and "The operation was canceled." with no exit code, the runner was lost rather than a step failing. A GitHub maintainer confirmed in actions/runner-images issue #15202 that once memory runs out, the VM stops responding before an out-of-memory message reaches the log. Give the job more memory: on Skipbox that is one runs-on line.
Is it an out-of-memory error?
On hosted runners, usually. A job killed while the runner survives shows exit code 137 instead; a job that takes the whole VM down shows the shutdown line. Either way the job needs more than ubuntu-latest's 8 GB, which every Skipbox plan gives at a flat price.
Why does a self-hosted runner show it?
Something stopped the runner process or its machine mid-job: a service restart, a reboot for updates, an autoscaler removing the machine, or the host running out of memory. On Skipbox the machines are managed for you, with a health check after every job and an automatic rebuild of a machine that fails it.
Does Skipbox's free trial fix a job that runs out of memory?
It gives the job 2× the memory. The trial runs runs-on: skipbox jobs at 4 vCPU and 16 GB, against the 8 GB of ubuntu-latest on a private repository. More memory than that means runs-on: skipbox-16x32 (32 GB) on plan L.
Updated November 11, 2026