bitlvl
SR

Referenca izlaznih kodova

Ukucajte kod da ga pronađete. Sve iznad 128 znači da je proces ubijen signalom: oduzmite 128 da dobijete broj signala. Tabela je na engleskom.

 
KodNazivZnačenje
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.

Rezultati i poruke ovog alata prikazuju se na engleskom.

Kako rade izlazni kodovi

Svaki proces se završava 8-bitnim statusom, od 0 do 255. Po konvenciji 0 znači uspeh, a sve ostalo neuspeh; školjka ga izlaže kao $?, a &&, ||, if i set -e svi granaju na osnovu njega. Značenje broja izvan nula/nije-nula pripada programu, uz nekoliko konvencija koje su gotovo univerzalne.

Kodovi same školjke

  • 126: datoteka je pronađena, ali nije mogla da se izvrši. Nedostaje bit za izvršavanje, radi se o direktorijumu, binarnoj datoteci za drugu arhitekturu ili noexec mount-u.
  • 127: nije pronađeno. Greška u kucanju, program koji nije instaliran, ili PATH koji se razlikuje između vaše školjke i okruženja u kom skripta radi (cron, systemd, Docker). Takođe shebang linija koja pokazuje na nepostojeći interpreter, uključujući \r\n završetke redova koji prave /bin/bash\r.
  • 128 + n: proces je umro od signala n. Školjka ne može direktno da vrati signal, pa dodaje 128. 130 je Ctrl-C (SIGINT 2), 137 je SIGKILL (9), 139 je SIGSEGV (11), 143 je SIGTERM (15). Referenca signala ih sve nabraja.

137 u kontejnerima

Izlaz 137 iz kontejnera je gotovo uvek OOM killer kernela ili container runtime koji sprovodi ograničenje memorije: procesu je poslat SIGKILL, koji ne može da se uhvati, pa aplikacija ništa nije zabeležila. Proverite docker inspect za OOMKilled: true, dmesg za „Out of memory“, ili Kubernetes događaje za OOMKilled. 143 je normalan rezultat docker stop ili gašenja poda kada je proces obradio SIGTERM; 137 posle zaustavljanja znači da se nije ugasio u predviđenom roku.

sysexits.h

BSD je definisao kodove 64–78 da bi alati za poštu i sistemski alati prijavljivali kategorije neuspeha (EX_USAGE 64, EX_NOINPUT 66, EX_TEMPFAIL 75…). Postfix, sendmail i neki Perl i Go programi ih i dalje koriste; ništa drugo ih ne koristi, pa ih tretirajte kao konvenciju, a ne pravilo.

Pitanja

Šta znači izlazni kod 1?

Opšti neuspeh: program je zaključio da je nešto pošlo naopako i nije imao specifičniji kod. Za grep znači da se nijedan red nije poklopio, što uopšte nije greška. Čitajte stderr izlaz programa, a ne broj.

Zašto dobijam 127 u cron-u ili systemd-u, ali ne u svojoj školjci?

PATH je drugačiji. Profil vaše školjke dodaje direktorijume kao /usr/local/bin ili ~/.local/bin koje cron i systemd ne vide. Koristite apsolutne putanje ili postavite PATH na vrhu skripte.

Koji je maksimalni izlazni kod?

255. exit 256 se prelama u 0, exit 300 postaje 44 (300 mod 256). Negativne vrednosti se takođe prelamaju: exit(-1) je 255.

Kako da dobijem izlazni kod pajplajna?

Podrazumevano $? je status poslednje komande. set -o pipefail čini da pajplajn ne uspe ako bilo koja faza ne uspe, a niz PIPESTATUS u bash-u sadrži kod svake faze.