IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

[坑]打rpm包时,注意%post和%postun的执行顺序

博学无忧 2015-11-08 22:56:40 累计浏览 1,919 次
本机暂存

问题

   掉进坑里面了。最近完成了阿里PHP5.5.25的rpm打包。今天在升级其中一个扩展的时候发现,只要升级成功之后,扩展在配置文件中相关配置项就会被注释掉。最终定位到是spec文件中%postun段写的有问题。

   spec文件中%postun段的代码示例如下:

   %postun

   conf_path="/php-fpm/lib/php.ini"

   sed -i 's/^\[tclip\]/;\[tclip\]/g' $conf_path

   sed -i 's/^extension=tclip.so/;extension=tclip.so/g' $conf_path

   代码的作用就是,当删除PHP扩展rpm包的时候,会自动修改配置文件,注释掉扩展配置项。

原因

   为啥在执行yum update 命令时,会导致扩展的配置项被自动注释掉呢?原因就在于spec执行顺序。

   假如你升级前的php-tclip包的版本是1.0。升级后的php-tclip包的版本是2.0。

   当你执行yum update php-tclip -y 命令升级时,%post和%postun段的执行顺序如下:

   首先,执行新的2.0包spec文件中的%post段代码。

   然后,执行旧的1.0包spec文件中的%postun段代码。

   当升级时,完整的执行流程如下:

   1、执行新包spec文件中 %pre 段.

   2、安装新包的相关依赖包.

   3、执行新包spec文件中的 %post 段.

   4、执行旧包spec文件中的 %preun 段.

   5、删除新包中不需要的旧文件。

   6、执行旧包spec文件中的 %postun 段.

解决方案

   其实不同的操作,会传不同的参数给 %postun段。当,传给%postun段的第一个参数是0时,代表卸载。我们的本意只有在卸载的时候,才需要执行%postun段的代码,自动注释php.ini的相关选项。我们只要增加判断就可以了。代码如下:

   %postun

   if [ $counter == 0 ] ; then

       conf_path="/php-fpm/lib/php.ini"

       sed -i 's/^\[tclip\]/;\[tclip\]/g' $conf_path

       sed -i 's/^extension=tclip.so/;extension=tclip.so/g' $conf_path

   fi

   完整的参数传递如下:

%pre和%post段

   当传递的第一个参数为1时,表示新安装一个rpm包。

   当传递的第一个参数为2时,表示升级一个已经存在的包。

%preun和%postun段

   当传递的第一个参数为0时,表示删除一个包。

   当传递的第一个参数为1时,表示更新一个包。

参考文档

   Packaging software with RPM, Part 2: Upgrading and uninstalling software

同分类推荐文章

  1. 从零重建 macOS 开发机:可复现的环境初始化流程 (2026-06-14 20:36:00)
  2. 百度物理网络监控工具开源第二弹:毫秒级监控工具 baize,让你的网络问题无处遁形 (2026-06-11 08:10:28)
  3. How to Set Up Homebrew Tap for Private CLI Tools: A Complete Guide (2026-05-27 02:13:03)

查看更多 DevOps 文章 →

建议继续学习

  1. Git log diff config高级进阶 (累计阅读 24,843)
  2. nginx的配置文件 (累计阅读 9,881)
  3. Zookeeper研究和应用 (累计阅读 9,481)
  4. 如何让ssh登录更加安全 (累计阅读 5,711)
  5. 如何解压rpm文件 (累计阅读 4,980)
  6. 共享会话的ssh连接配置 (累计阅读 4,817)
  7. 调整 QQ for Linux 的小技巧 (累计阅读 4,479)
  8. puppet使用rsync来同步文件教程 (累计阅读 4,210)
  9. rpm删除出现”error: %preun( ) scriptlet failed, exit status 1解决方法 (累计阅读 4,132)
  10. 有关 SVN、Cygwin 和 Notepad++ (累计阅读 4,056)