GitHub Actions "The runner has received a shutdown signal" (Spot Reclaim)
By Kaveh Alemi·Latchkey
A self-hosted/spot runner received an OS shutdown signal while a job was running - usually a spot or preemptible instance being reclaimed by the cloud provider - so the job was canceled mid-flight.
What this error means
A running job ends with "The runner has received a shutdown signal" and "The operation was canceled", typically with no clean error. Re-running on fresh capacity passes.
Actions log
The runner has received a shutdown signal. This can happen when the runner
service is stopped, or a manually started runner is canceled.
The operation was canceled.
Common causes
Spot/preemptible instance reclaimed
Cloud providers reclaim spot/preemptible VMs on short notice. The OS sends a shutdown signal, the runner agent stops, and the job is canceled.
Host stopped or scaled down mid-job
An autoscaler scaling in, a manual stop, or a host reboot signals the runner to shut down before the job finishes.
How to fix it
Re-queue the job on fresh capacity
Re-run the job; reclaim is transient and the retry lands on a new instance.
Configure the autoscaler to re-queue interrupted jobs automatically.
Drain runners gracefully (finish the current job) before scale-in where possible.
Use stable capacity for critical jobs
Run release/deploy jobs on on-demand runners and reserve spot for retryable CI to avoid mid-job reclaim of important work.
How to prevent it
Run critical jobs on on-demand runners, spot for retryable CI.
Make the autoscaler re-queue jobs interrupted by reclaim.
Drain runners before scaling in to avoid mid-job shutdowns.
Frequently asked questions
What causes ""received a shutdown signal""?
Cloud providers reclaim spot/preemptible VMs on short notice. The OS sends a shutdown signal, the runner agent stops, and the job is canceled.
How do I fix "received a shutdown signal"?
Re-queue the job on fresh capacity
Can Latchkey fix this automatically?
Yes. Latchkey runs your GitHub Actions on managed runners that detect this failure, apply the fix, and retry the job automatically - self-healing is on by default.