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
noexecmount-u. - 127: nije pronađeno. Greška u kucanju, program koji nije instaliran, ili
PATHkoji 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\nzavrš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.