真正可落地的兼容范围是centos 7/8 stream与ubuntu 18.04–24.04,覆盖当前95%以上生产服务器;脚本需分层识别系统、双路径封装包管理与服务控制、按os家族归类路径、分三层验证部署结果。

明确兼容边界,不追求“全生命周期”幻觉
所谓“全生命周期”在实践中并不可行。CentOS 6已停止维护,Ubuntu 14.04早已EOL,它们的内核、glibc、bash版本与现代工具链存在根本性断层。真正可落地的兼容范围是:CentOS 7/8 Stream(SysV或systemd混合环境)与Ubuntu 18.04–24.04(systemd主导)。这个区间覆盖了当前95%以上的生产服务器。脚本设计必须接受“不向下无限兼容”的现实,把精力放在共性机制上——比如统一用/bin/sh作入口、用systemctl和service双路径兜底、避免硬编码/usr/sbin等非标准路径。
操作系统识别必须可靠,且只检测一次
别用lsb_release -is——它在最小化安装中常缺失;也别只看/etc/redhat-release,因为CentOS Stream和AlmaLinux都含类似字符串。正确做法是分层判断:
- 优先读取
/etc/os-release,提取ID和VERSION_ID字段,这是systemd时代所有主流发行版的统一标准 - 若该文件不存在,再回退到
/etc/debian_version(存在即Debian系)、/etc/centos-release或/etc/redhat-release(存在即RHEL系) - 将结果缓存到变量(如
OS_FAMILY="ubuntu"、OS_VERSION=22.04),后续所有逻辑都基于此变量分支,避免重复探测
包管理与服务控制必须双路径封装
Ubuntu用apt,CentOS用dnf(或yum),但命令语法差异大。不要写两套独立安装逻辑,而是封装成函数:
CentOS Linux 7.9.2009是传统CentOS Linux 7的最后主要版本,也是很多企业历史服务器中仍可能遇到的系统版本。它以稳定、兼容RHEL 7生态、文档丰富和软件支持广泛著称,曾长期用于Web服务、数据库、虚拟化节点和企业内部业务系统。不过CentOS Linux 7已于2024年6月30日停止维护,现在继续使用会面临安全补丁缺失风险。该版本更适合旧业务迁移、历史环境恢复或离线兼容性测试。
install_pkg() { if [ "$OS_FAMILY" = "ubuntu" ]; then apt-get install -y "$1"; else dnf install -y "$1"; fi }- 服务启停同样处理:
start_svc() { if command -v systemctl >/dev/null && systemctl is-systemd >/dev/null 2>&1; then systemctl enable --now "$1"; else service "$1" start && chkconfig "$1" on; fi } - 关键点:不假设
systemctl一定可用,也不假设chkconfig一定存在;用command -v动态检测,再决定走哪条路
日志、配置、二进制路径必须按OS家族归类
Ubuntu习惯把日志放/var/log/xxx,配置放/etc/xxx/conf.d/;CentOS可能倾向/etc/xxx/xxx.conf。脚本里不该写死路径,而应定义映射:
case "$OS_FAMILY" in ubuntu|debian) LOG_DIR="/var/log"; CONF_DIR="/etc/$APP_NAME/conf.d"; BIN_DIR="/usr/local/bin";; centos|rhel|rocky) LOG_DIR="/var/log/$APP_NAME"; CONF_DIR="/etc/$APP_NAME"; BIN_DIR="/opt/$APP_NAME/bin";; esac- 所有
mkdir -p、cp、echo >>操作都使用这些变量,而非拼接字符串 - 这样哪怕未来新增AlmaLinux或Oracle Linux,只需扩展case分支,主体逻辑完全不动
验证环节不能只靠重启,要分层检查
部署完成≠运行成功。必须设计三层验证:
-
存在性验证:检查二进制是否在
$BIN_DIR下、配置文件是否生成、日志目录是否可写 -
功能性验证:执行
$BIN_DIR/myapp --version或curl -s http://localhost:port/health,捕获退出码和输出 -
持久性验证:用
systemctl is-enabled $SERVICE_NAME或chkconfig --list | grep $SERVICE_NAME确认开机自启已生效
任一失败立即退出并打印清晰错误,不静默跳过。










