[经验总结]Exec format error——Shebang解释器声明省略的锅
1. 问题背景
使用keepalived部署高可用时,发现其执行指定shell检查脚本报了Exec format error
的错误,如图。
根据我对脚本的分析,最终确定了是脚本缺少Shebang教师齐声明导致的问题。
2. 原因解析
2.1 Shebang 解释器声明
#!
(称为 Shebang 或 Hashbang)是脚本的第一行,用于指定解释器路径。
当系统执行脚本时,内核会根据 Shebang 调用对应的解释器。
2.2 未添加Shebang的影响
如未添加Shebang,那么脚本的执行方——系统或者指定应用,将会已默认方式解析该脚本。
- 如果是系统执行了该脚本,那么默认一般是bash或者csh。(可用
env
命令查看shell
变量的取值,图下图) - 如果是Keepalived执行该脚本,那么默认的解析方式将不会是shell,而是二进制
execve
的形式。
2.3 Keepalived 调用方式的影响
Keepalived 通过 execve 系统调用直接执行脚本,而非通过 shell 解释器。
若脚本缺少 Shebang,内核无法识别文件类型,直接报错(错误码 8: Exec format error)。
3. 总结
因此平常看似可有可无的一句声明,建议习惯性地在每个脚本中进行注明,已避免产生此类乌龙。
原创,转发请注明。