Cómo funcionan los códigos de salida
Todo proceso termina con un estado de 8 bits, de 0 a 255. Por convención 0 significa éxito y cualquier otro valor fallo; la shell lo expone como $?, y &&, ||, if y set -e bifurcan según él. El significado del número más allá de cero/no cero pertenece al programa, con unas pocas convenciones casi universales.
Los códigos propios de la shell
- 126: el archivo se encontró pero no pudo ejecutarse. Falta el bit de ejecución, es un directorio, un binario de otra arquitectura o un montaje
noexec. - 127: no encontrado. Una errata, un programa no instalado o un
PATHdistinto entre tu shell y el entorno en que se ejecuta el script (cron, systemd, Docker). También una línea shebang que apunta a un intérprete inexistente, incluidos finales de línea\r\nque producen/bin/bash\r. - 128 + n: el proceso murió por la señal n. La shell no puede devolver una señal directamente, así que suma 128. 130 es Ctrl-C (SIGINT 2), 137 es SIGKILL (9), 139 es SIGSEGV (11), 143 es SIGTERM (15). La referencia de señales las lista todas.
137 en contenedores
Un exit 137 de un contenedor es casi siempre el OOM killer del kernel o el runtime de contenedores aplicando un límite de memoria: al proceso se le envió SIGKILL, que no puede capturarse, así que la aplicación no registró nada. Comprueba docker inspect buscando OOMKilled: true, dmesg buscando «Out of memory», o los eventos de Kubernetes buscando OOMKilled. 143 es el resultado normal de docker stop o de la terminación de un pod cuando el proceso manejó SIGTERM; 137 tras un stop significa que no se cerró dentro del periodo de gracia.
sysexits.h
BSD definió los códigos 64–78 para que las herramientas de correo y de sistema informaran de categorías de fallo (EX_USAGE 64, EX_NOINPUT 66, EX_TEMPFAIL 75…). Postfix, sendmail y algunos programas en Perl y Go aún los usan; nada más lo hace, así que trátalos como una convención, no como una regla.
Preguntas
¿Qué significa el código de salida 1?
Un fallo genérico: el programa decidió que algo fue mal y no tenía un código más específico. Para grep significa que ninguna línea coincidió, que no es un error en absoluto. Lee la salida stderr del programa, no el número.
¿Por qué obtengo 127 en cron o systemd pero no en mi shell?
El PATH es distinto. El perfil de tu shell añade directorios como /usr/local/bin o ~/.local/bin que cron y systemd no ven. Usa rutas absolutas o fija PATH al principio del script.
¿Cuál es el código de salida máximo?
255. exit 256 da la vuelta a 0, exit 300 se convierte en 44 (300 mod 256). Los valores negativos también dan la vuelta: exit(-1) es 255.
¿Cómo obtengo el código de salida de una tubería?
Por defecto $? es el estado del último comando. set -o pipefail hace que la tubería falle si falla cualquier etapa, y el array PIPESTATUS de bash contiene el código de cada etapa.