bitlvl
IT

Riferimento dei codici di uscita

Scrivi un codice per trovarlo. Qualsiasi valore sopra 128 significa che il processo è stato ucciso da un segnale: sottrai 128 per ottenere il numero del segnale. La tabella è in inglese.

 
CodiceNomeSignificato
0SuccessThe command completed without error.
1General errorCatch-all: the program chose to signal failure (grep: no match; many tools: any error).
2Misuse of shell builtin / usage errorBash: wrong arguments to a builtin. grep: an error occurred (not just no match). Many CLIs: bad usage.
64EX_USAGECommand line usage error (sysexits.h).
65EX_DATAERRInput data was incorrect.
66EX_NOINPUTInput file did not exist or was unreadable.
67EX_NOUSERUser does not exist.
68EX_NOHOSTHost does not exist.
69EX_UNAVAILABLEService unavailable.
70EX_SOFTWAREInternal software error.
71EX_OSERROS error (fork failed, etc.).
72EX_OSFILECritical OS file missing.
73EX_CANTCREATCannot create output file.
74EX_IOERRInput/output error.
75EX_TEMPFAILTemporary failure; retry later (mail systems).
76EX_PROTOCOLRemote error in protocol.
77EX_NOPERMPermission denied.
78EX_CONFIGConfiguration error.
100Debian apt / dpkg errorapt-get: a package operation failed. Also Python: nothing standard.
125Docker: daemon errordocker run itself failed (bad option, image not found). Also xargs: command killed by signal / other failures.
126Command cannot executeFound but not executable (permission denied, or a directory). Also Docker: contained command cannot be invoked.
127Command not foundThe shell could not find the program on PATH (typo, missing package, wrong shebang).
128Invalid exit argumentexit called with a value outside 0–255.
129Killed by SIGHUP (128+1)Terminal hung up or daemon reload signal.
130Killed by SIGINT (128+2)Ctrl-C.
131Killed by SIGQUIT (128+3)Ctrl-\ (core dump).
132Killed by SIGILL (128+4)Illegal instruction: corrupted binary or wrong CPU architecture.
133Killed by SIGTRAP (128+5)Debugger breakpoint.
134Killed by SIGABRT (128+6)abort(): assertion failure, glibc detected heap corruption, Go/Rust panic in some modes.
135Killed by SIGBUS (128+7)Bus error: misaligned access or a memory-mapped file that was truncated.
136Killed by SIGFPE (128+8)Arithmetic error, typically integer division by zero.
137Killed by SIGKILL (128+9)Forcibly killed: OOM killer (check dmesg), kill -9, Docker/Kubernetes memory limit, timeout -s KILL.
139Killed by SIGSEGV (128+11)Segmentation fault: invalid memory access.
141Killed by SIGPIPE (128+13)Wrote to a closed pipe, e.g. `cmd | head` after head exited.
143Killed by SIGTERM (128+15)Polite termination request: kill, systemctl stop, docker stop (after the grace period it becomes 137).
148Killed by SIGTSTP (128+20)Ctrl-Z (stopped, reported by some shells).
152Killed by SIGXCPU (128+24)CPU time limit exceeded (ulimit -t).
153Killed by SIGXFSZ (128+25)File size limit exceeded (ulimit -f).
255Exit status out of range / -1exit(-1) wraps to 255. ssh: connection or protocol error. rsync: unexplained error.

I risultati e i messaggi di questo strumento sono mostrati in inglese.

Come funzionano i codici di uscita

Ogni processo termina con uno stato a 8 bit, da 0 a 255. Per convenzione 0 significa successo e qualsiasi altro valore fallimento; la shell lo espone come $?, e &&, ||, if e set -e si diramano tutti in base a esso. Il significato del numero oltre a zero/non-zero appartiene al programma, con alcune convenzioni quasi universali.

I codici propri della shell

  • 126: il file è stato trovato ma non può essere eseguito. Bit di esecuzione mancante, una directory, un binario per un’altra architettura, o un mount noexec.
  • 127: non trovato. Un errore di battitura, un programma non installato, o un PATH diverso tra la tua shell e l’ambiente in cui gira lo script (cron, systemd, Docker). Anche una riga shebang che punta a un interprete mancante, compresi i fine riga \r\n che producono /bin/bash\r.
  • 128 + n: il processo è morto per il segnale n. La shell non può restituire direttamente un segnale, quindi aggiunge 128. 130 è Ctrl-C (SIGINT 2), 137 è SIGKILL (9), 139 è SIGSEGV (11), 143 è SIGTERM (15). Il riferimento dei segnali li elenca tutti.

137 nei container

Un exit 137 da un container è quasi sempre l’OOM killer del kernel o il runtime del container che applica un limite di memoria: al processo è stato inviato SIGKILL, che non può essere catturato, quindi l’applicazione non ha registrato nulla. Controlla docker inspect per OOMKilled: true, dmesg per «Out of memory», o gli eventi Kubernetes per OOMKilled. 143 è il risultato normale di docker stop o della terminazione di un pod quando il processo ha gestito SIGTERM; 137 dopo uno stop significa che non si è chiuso entro il periodo di grazia.

sysexits.h

BSD ha definito i codici 64–78 perché gli strumenti di posta e di sistema riportino categorie di fallimento (EX_USAGE 64, EX_NOINPUT 66, EX_TEMPFAIL 75…). Postfix, sendmail e alcuni programmi Perl e Go li usano ancora; nient’altro lo fa, quindi trattali come una convenzione, non una regola.

Domande

Cosa significa il codice di uscita 1?

Un fallimento generico: il programma ha deciso che qualcosa è andato storto e non aveva un codice più specifico. Per grep significa che nessuna riga ha corrisposto, il che non è affatto un errore. Leggi lo stderr del programma, non il numero.

Perché ottengo 127 in cron o systemd ma non nella mia shell?

Il PATH è diverso. Il profilo della tua shell aggiunge directory come /usr/local/bin o ~/.local/bin che cron e systemd non vedono. Usa percorsi assoluti o imposta PATH in cima allo script.

Qual è il codice di uscita massimo?

255. exit 256 torna a 0, exit 300 diventa 44 (300 mod 256). Anche i valori negativi girano: exit(-1) è 255.

Come ottengo il codice di uscita di una pipeline?

Di default $? è lo stato dell’ultimo comando. set -o pipefail fa fallire la pipeline se fallisce qualsiasi stadio, e l’array PIPESTATUS in bash contiene il codice di ogni stadio.