[坑]打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 [ "$1" = "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时,表示更新一个包。

目录
相关文章
执行apt-get install xxx 遇到无法定位软件包解决方法
执行apt-get install xxx 遇到无法定位软件包解决方法
2597 0
执行apt-get install xxx 遇到无法定位软件包解决方法
|
4月前
|
Java API Python
python并发执行request请求
选择哪种并发方式取决于我们的具体需求。对于I/O密集型任务,多线程或异步I/O通常是更好的选择;对于CPU密集型任务,多进程可能是更好的选择。此外,异步I/O通常比多线程具有更好的性能,特别是在高并发的网络应用中。
|
6月前
|
JavaScript Java 数据安全/隐私保护
安卓逆向 -- POST数据解密
安卓逆向 -- POST数据解密
139 2
|
6月前
|
PHP 数据格式
PHP 中的CURL 模拟表单的post提交
PHP 中的CURL 模拟表单的post提交
104 0
|
PHP 开发者
Composer update命令是干什么的?底层原理是什么?
Composer update命令是干什么的?底层原理是什么?
1973 0
执行 mysqld --install 报错:由于找不到VCRUNTIME140 1.dII, 无法继续执行代码
执行 mysqld --install 报错:由于找不到VCRUNTIME140 1.dII, 无法继续执行代码
113 0
执行 mysqld --install 报错:由于找不到VCRUNTIME140 1.dII, 无法继续执行代码
|
资源调度 前端开发
axios的安装指令
axios的安装指令
|
Java 应用服务中间件 Maven
maven项目未install导致请求404
maven项目未install导致请求404...
2911 0
|
搜索推荐
1、【基础环境安装】conda httperror http none none for url none Anaconda更新失败解决办法
优惠券、百度网盘搜索引擎【it快速自学导航 so.kszixue.com 】谢谢支持,优惠券搜索引擎教程地址:https://www.jianshu.com/c/905dd533e07d 今日更新:优惠券、百度网盘搜索引擎 it快速自学导航 so.kszixue.com(你懂的!) conda httperror http none none for url none Anaconda更新失败 问题描述: 1、在conda安装好之后,默认的镜像是官方的,由于官网的镜像在境外,访问太慢或者不能访问,为了能够加快访问的速度,这里选择了清华的的镜像。
1823 0
|
JavaScript 关系型数据库
NodeJS 发送 POST 请求 curl -d & JS 类的静态属性使用
NodeJS 发送 POST 请求 curl -d & JS 类的静态属性使用 'use strict'; const Service = require('.
1566 0