如何编写自适应系统版本的Shell动态部署脚本完美兼容CentOS与Ubuntu全生命周期

舞夢輝影

舞夢輝影

2026-06-10

450人浏览

原创

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

如何编写自适应系统版本的shell动态部署脚本完美兼容centos与ubuntu全生命周期

明确兼容边界,不追求“全生命周期”幻觉

所谓“全生命周期”在实践中并不可行。CentOS 6已停止维护,Ubuntu 14.04早已EOL,它们的内核、glibc、bash版本与现代工具链存在根本性断层。真正可落地的兼容范围是:CentOS 7/8 Stream(SysV或systemd混合环境)与Ubuntu 18.04–24.04(systemd主导)。这个区间覆盖了当前95%以上的生产服务器。脚本设计必须接受“不向下无限兼容”的现实,把精力放在共性机制上——比如统一用/bin/sh作入口、用systemctlservice双路径兜底、避免硬编码/usr/sbin等非标准路径。

操作系统识别必须可靠,且只检测一次

别用lsb_release -is——它在最小化安装中常缺失;也别只看/etc/redhat-release,因为CentOS Stream和AlmaLinux都含类似字符串。正确做法是分层判断:

  • 优先读取/etc/os-release,提取IDVERSION_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.9.2009

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 -pcpecho >>操作都使用这些变量,而非拼接字符串
  • 这样哪怕未来新增AlmaLinux或Oracle Linux,只需扩展case分支,主体逻辑完全不动

验证环节不能只靠重启,要分层检查

部署完成≠运行成功。必须设计三层验证:

  • 存在性验证:检查二进制是否在$BIN_DIR下、配置文件是否生成、日志目录是否可写
  • 功能性验证:执行$BIN_DIR/myapp --versioncurl -s http://localhost:port/health,捕获退出码和输出
  • 持久性验证:用systemctl is-enabled $SERVICE_NAMEchkconfig --list | grep $SERVICE_NAME确认开机自启已生效

任一失败立即退出并打印清晰错误,不静默跳过。

相关专题

更多
磁盘配额是什么
磁盘配额是什么

磁盘配额是计算机中指定磁盘的储存限制,就是管理员可以为用户所能使用的磁盘空间进行配额限制,每一用户只能使用最大配额范围内的磁盘空间。php中文网为大家提供各种磁盘配额相关的内容,教程,供大家免费下载安装。

2023.06.21

2693

4

如何安装LINUX
如何安装LINUX

本站专题提供如何安装LINUX的相关教程文章,还有相关的下载、课程,大家可以免费体验。

2023.06.29

1650

10

linux find
linux find

find是linux命令,它将档案系统内符合 expression 的档案列出来。可以指要档案的名称、类别、时间、大小、权限等不同资讯的组合,只有完全相符的才会被列出来。find根据下列规则判断 path 和 expression,在命令列上第一个 - ( ) , ! 之前的部分为 path,之后的是 expression。还有指DOS 命令 find,Excel 函数 find等。本站专题提供linux find相关教程文章,还有相关

2023.06.30

1298

5

linux修改文件名
linux修改文件名

本专题为大家提供linux修改文件名相关的文章,这些文章可以帮助用户快速轻松地完成文件名的修改工作,大家可以免费体验。

2023.07.05

2674

7

linux系统安装教程
linux系统安装教程

linux系统是一种可以免费使用,自由传播,多用户、多任务、多线程、多CPU的操作系统。本专题提供linux系统安装教程相关的文章,大家可以免费体验。

2023.07.06

2441

7

linux查看文件夹大小
linux查看文件夹大小

Linux是一种自由和开放源码的类Unix操作系统,存在着许多不同的Linux版本,但它们都使用了Linux内核。Linux可安装在各种计算机硬件设备中,比如手机、平板电脑、路由器、视频游戏控制台、台式计算机、大型机和超级计算机。linux怎么查看文件夹大小呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.07.20

1660

8

linux查看ip命令
linux查看ip命令

本专题为大家提供linux查看ip命令相关文章内容,感兴趣的朋友可以免费下载体验试试。

2023.07.20

1254

4

linux查看cpu使用率
linux查看cpu使用率

在linux的系统维护中,可能需要经常查看cpu使用率,分析系统整体的运行情况。本专题为大家带来了linux查看cpu使用率的相关文章,感兴趣的朋友千万不要错过了。

2023.07.25

1423

6

linux查找文件命令
linux查找文件命令

Linux是一种自由和开放源码的类Unix操作系统,存在着许多不同的Linux版本,但它们都使用了Linux内核。Linux可安装在各种计算机硬件设备中,比如手机、平板电脑、路由器、视频游戏控制台、台式计算机、大型机和超级计算机。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.07.31

210

3

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
尚观shell视频教程
尚观shell视频教程

共8课时 | 1.8万人学习

Linux开发视频教程
Linux开发视频教程

共18课时 | 4.5万人学习

Perl 入门教程
Perl 入门教程

共29课时 | 30.3万人学习