[坑]打rpm包时,注意%post和%postun的执行顺序
问题
掉进坑里面了。最近完成了阿里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
建议继续学习:
- 如何解压rpm文件 (阅读:4008)
- rpm删除出现”error: %preun( ) scriptlet failed, exit status 1解决方法 (阅读:3748)
- [Linux]编译一个 RHEL 定制的内核 rpm 包 (阅读:2821)
- Redhat 使用Yum安装、更新rpm包 (阅读:2563)
- 给 perl 的模块打包成rpm (阅读:2459)
- RPM包的管理 (阅读:2400)
- linux下源码包制作成rpm包教程 (阅读:2186)
- 快速创建pear/pecl的rpm (阅读:2122)
- RPM 与 DEB 的兼容 (阅读:1955)
- rpm Build 相关知识 (阅读:1854)
扫一扫订阅我的微信号:IT技术博客大学习
- 作者:信海龙 来源: 博学无忧
- 标签: rpm
- 发布时间:2015-11-08 22:56:40
- [55] IOS安全–浅谈关于IOS加固的几种方法
- [53] 如何拿下简短的域名
- [52] 图书馆的世界纪录
- [52] android 开发入门
- [50] Go Reflect 性能
- [50] Oracle MTS模式下 进程地址与会话信
- [48] 【社会化设计】自我(self)部分――欢迎区
- [47] 读书笔记-壹百度:百度十年千倍的29条法则
- [36] 程序员技术练级攻略
- [29] 视觉调整-设计师 vs. 逻辑