Exit Code 137 Explicado: SIGKILL e o OOM Killer no CI
Exit code 137 significa que um processo foi terminado por SIGKILL. O número é 128 + 9, onde 9 é o signal - e no CI o culpado é quase sempre o out-of-memory killer.
Quando um step de CI termina com exit code 137, ele não "retornou" esse código - ele foi morto. Entender a codificação diz exatamente o que aconteceu e por que geralmente não há stack trace.
A codificação 128 + N
Por convenção Unix, um processo terminado pelo signal N reporta o exit code 128 + N. SIGKILL é o signal 9, então 128 + 9 = 137. Da mesma forma, SIGTERM (15) é 143 e SIGINT (2) é 130. Ver um código acima de 128 é seu sinal de que um signal - não a lógica do próprio programa - encerrou o processo.
Por que é quase sempre OOM no CI
SIGKILL não pode ser capturado, bloqueado ou ignorado, então o kernel o usa quando precisa forçar um processo a morrer imediatamente. Em runners de CI com memória limitada, a fonte mais comum é o out-of-memory killer do cgroup recuperando memória ao matar o processo mais pesado. É por isso que 137 costuma aparecer apenas com a palavra Killed e sem traceback.
Como confirmar e corrigir
- Verifique o uso de memória do runner por volta da falha, ou o log do kernel por uma linha
oom-kill. - Dê mais memória ao job, ou reduza o uso de pico (menos paralelismo, limite os heaps das linguagens).
- Descarte um watchdog externo ou
timeout --signal=KILLse a memória parecer estar bem.
Principais conclusões
- Exit code 137 = morto por SIGKILL (128 + 9).
- No CI é esmagadoramente o out-of-memory killer.
- Raramente há stack trace porque SIGKILL não pode ser interceptado.
- A correção é mecânica: mais memória ou menor uso de pico.
Perguntas frequentes
O exit 137 pode acontecer sem ficar sem memória?
kill -9. Mas em runners de CI com memória restrita, o OOM é de longe a causa mais provável.