部署脚本退出码 127/126/137/139:Linux 自动化安装失败的排查路径
自动化脚本(安装/部署)失败时,先别急着重跑,先归类。常见四类:环境依赖冲突(库版本不匹配、ABI 缺失,优先级高)、资源配额限制(磁盘耗尽、文件描述符溢出)、权限与安全策略(SELinux 拦截、Capability 缺失,优先级高)、脚本逻辑错误(语法错误、未处理的信号中断)。
退出码 → 含义 → 排查动作
退出码是最直接的诊断入口。
| 退出码 | 含义 | 排查动作 |
|---|---|---|
| 127 | Command not found | 脚本调用的二进制不在 PATH,或依赖的解释器(如 /usr/bin/python3)缺失。检查环境变量 env |
| 126 | Permission denied | 文件存在但不可执行,或受 noexec 挂载选项限制。检查 ls -l 权限位及挂载点属性 |
| 137 | SIGKILL | 进程被内核强制杀死,通常是 OOM Killer。检查 dmesg | grep -i oom |
| 139 | SIGSEGV | 段错误,通常是 ABI 不兼容。检查 ldd 输出 |
日志与追踪
- 脚本卡死用
strace -f -o trace.log ./install.sh,观察最后几行openat或execve的返回值; - 内核级审计
dmesg -T | tail -n 50,看内核模块加载失败或硬件 I/O 错误; - 网络可达性用
curl -Iv观察 TCP 握手与 TLS 协商,或用mtr看链路丢包;不要只写「检查网络」。
防御性调试
脚本头部加上这样一段:
#!/bin/bash
set -euxo pipefail
trap 'echo "Error at line $LINENO: $BASH_COMMAND"; exit 1' ERR
command -v curl >/dev/null 2>&1 || { echo "curl 未安装,终止执行"; exit 1; }
exec > >(tee -i /var/log/install_debug.log) 2>&1
这套片段能把大部分隐蔽错误暴露到控制台。仍解决不了时,看 /var/log/syslog 或 /var/log/messages 里的具体错误堆栈。
脚本崩溃不是偶然,是环境预期与实际执行的偏差;盲目重跑只会掩盖配置腐化。