Exit codes & signals
What does that exit code mean?
A process killed by signal N exits with 128 + N: 137 = SIGKILL
(often OOMKilled), 143 = SIGTERM, 139 = SIGSEGV, 130 = Ctrl-C.
Unix signals
| Signal | No. | Exit | Meaning |
|---|---|---|---|
| SIGHUP | 1 | 129 | Hangup — controlling terminal closed or the controlling process died. Often used to tell daemons to reload config. |
| SIGINT | 2 | 130 | Interrupt from the keyboard (Ctrl-C). |
| SIGQUIT | 3 | 131 | Quit from the keyboard (Ctrl-\); also dumps core. |
| SIGILL | 4 | 132 | Illegal instruction — corrupted binary or bad CPU instruction. |
| SIGTRAP | 5 | 133 | Trace/breakpoint trap, used by debuggers. |
| SIGABRT | 6 | 134 | Abort — from abort(), a failed assertion, glibc heap corruption, or an uncaught C++ exception. |
| SIGBUS | 7 | 135 | Bus error — bad memory access, e.g. misaligned access or a truncated mmap. |
| SIGFPE | 8 | 136 | Arithmetic exception, e.g. integer divide-by-zero or overflow. |
| SIGKILL | 9 | 137 | Killed immediately; cannot be caught, blocked, or ignored. Sent by `kill -9` and by the Linux OOM killer. |
| SIGUSR1 | 10 | 138 | User-defined signal 1 (application-specific). |
| SIGSEGV | 11 | 139 | Segmentation fault — invalid memory reference; almost always a bug in native code. |
| SIGUSR2 | 12 | 140 | User-defined signal 2 (application-specific). |
| SIGPIPE | 13 | 141 | Broken pipe — wrote to a pipe or socket with no reader. |
| SIGALRM | 14 | 142 | Timer expired (alarm()). |
| SIGTERM | 15 | 143 | Polite termination request — the default of `kill` and the signal orchestrators send to ask a process to shut down. |
| SIGSTKFLT | 16 | 144 | Stack fault on coprocessor (rarely used). |
| SIGCHLD | 17 | 145 | A child process stopped or terminated. |
| SIGCONT | 18 | 146 | Continue a process if it was stopped. |
| SIGSTOP | 19 | 147 | Stop the process; cannot be caught or ignored. |
| SIGTSTP | 20 | 148 | Stop typed at the terminal (Ctrl-Z). |
| SIGTTIN | 21 | 149 | Background process tried to read from the terminal. |
| SIGTTOU | 22 | 150 | Background process tried to write to the terminal. |
| SIGURG | 23 | 151 | Urgent (out-of-band) data on a socket. |
| SIGXCPU | 24 | 152 | CPU time limit exceeded (ulimit). |
| SIGXFSZ | 25 | 153 | File size limit exceeded (ulimit). |
| SIGVTALRM | 26 | 154 | Virtual timer expired. |
| SIGPROF | 27 | 155 | Profiling timer expired. |
| SIGWINCH | 28 | 156 | Terminal window size changed. |
| SIGIO | 29 | 157 | I/O is now possible (SIGPOLL). |
| SIGPWR | 30 | 158 | Power failure. |
| SIGSYS | 31 | 159 | Bad system call (e.g. blocked by a seccomp filter). |
Common exit codes
| Code | Meaning |
|---|---|
| 0 | Success. |
| 1 | General / catch-all error. |
| 2 | Shell builtin misuse or a CLI usage error (many tools use 2 for bad arguments). |
| 126 | Command found but not executable (permission denied, or it is a directory). |
| 127 | Command not found — typo or not on PATH. |
| 128 | Invalid argument to exit (valid range is 0-255). |
| 130 | Terminated by SIGINT (128 + 2) — Ctrl-C. |
| 134 | Terminated by SIGABRT (128 + 6) — abort()/assert. |
| 137 | Terminated by SIGKILL (128 + 9) — often an out-of-memory kill. |
| 139 | Terminated by SIGSEGV (128 + 11) — segmentation fault. |
| 143 | Terminated by SIGTERM (128 + 15) — graceful shutdown request. |
| 255 | Exit status out of range (e.g. `exit -1`) or a generic fatal error. |
Common curl exit codes
| Code | Meaning |
|---|---|
| 1 | Unsupported protocol — this build of curl has no support for it. |
| 2 | Failed to initialize. |
| 3 | The URL was malformed. |
| 5 | Couldn't resolve the proxy host. |
| 6 | Couldn't resolve the host — DNS failure or a typo in the hostname. |
| 7 | Failed to connect to the host or proxy — wrong port, firewall, or service down. |
| 8 | The server sent data curl could not parse. |
| 9 | Access to the remote resource was denied. |
| 18 | The transfer ended early — fewer bytes arrived than expected. |
| 22 | With -f/--fail, the server returned an HTTP status of 400 or higher. |
| 23 | Could not write the received data to the local file or disk. |
| 26 | Could not read the local file you tried to upload. |
| 27 | A memory allocation request failed. |
| 28 | The operation timed out (--max-time / --connect-timeout reached). |
| 35 | The TLS/SSL handshake failed — protocol or cipher mismatch. |
| 43 | Internal error: a function was called with a bad argument. |
| 47 | Too many redirects (raise with --max-redirs). |
| 51 | The server's certificate or fingerprint failed verification. |
| 52 | The server returned nothing (an empty reply). |
| 55 | Failed sending network data. |
| 56 | Failure receiving network data. |
| 58 | Problem with the local client certificate. |
| 60 | The CA cert is unknown or the certificate is invalid/expired/self-signed (add --cacert or fix the chain). |
| 61 | Unrecognized transfer encoding. |
| 63 | Maximum file size exceeded (--max-filesize). |
| 67 | The server denied login — wrong username or password. |
| 77 | Problem reading the SSL CA cert. |
| 78 | The remote file was not found. |
Questions
On Unix, when a process is killed by a signal, its exit status is 128 plus the signal number. So 137 = 128 + 9 = SIGKILL, 143 = 128 + 15 = SIGTERM, 139 = 128 + 11 = SIGSEGV, and 130 = 128 + 2 = SIGINT (Ctrl-C). ExitCode does that subtraction for you and names the signal.
Exit 137 means the process got SIGKILL. In Docker and Kubernetes that is almost always the out-of-memory killer enforcing a memory limit (Kubernetes labels it OOMKilled), or an orchestrator escalating to SIGKILL after a SIGTERM was ignored past the grace period. Compare the container's memory usage against its limit, raise the limit or reduce usage, and make sure the app exits promptly on SIGTERM.
127 means the command was not found at all — a typo, a missing package, or it is not on PATH (very common in minimal containers). 126 means the command was found but could not be executed — usually a missing execute bit, a non-executable file, or a bad interpreter line in a script.
The common ones (SIGKILL 9, SIGTERM 15, SIGINT 2, SIGSEGV 11, SIGABRT 6) are the same across Linux and most Unix. A few — SIGUSR1, SIGUSR2, SIGBUS — have different numbers on MIPS, Alpha, and SPARC, and real-time signals occupy 34-64. ExitCode uses the standard Linux x86-64/ARM numbers.
curl has its own numbering that is unrelated to signals: 6 is "couldn't resolve host", 7 is "couldn't connect", 28 is a timeout, 60 is a TLS certificate problem, and 22 means the server returned an HTTP error of 400+ when you used -f/--fail. Switch the context to "curl" to decode those, since the same number means something completely different there.
No. ExitCode is a static lookup that runs entirely in your browser. There is no backend, no logging, and nothing leaves the page.