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
PATHdiverso 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\nche 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.