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

目录
相关文章
|
网络协议 前端开发 Unix
QEMU&KVM-2 Live Migration
虚拟机的迁移是指把一台VM上的OS迁移到另外一台VM,两个VM可以run在不同的物理机上。 包括:Offline Migration和Live Migration。这里讲讲比较常用的Live Migration(热迁移)。 在热迁移过程中,Guest OS完全无感,其运行的任务,在快速迁移过后能继续运行。 首先,对于Guest OS从一个VM迁移到其他VM,涉及到对register配置,di
8246 0
QEMU&KVM-2 Live Migration
|
Ubuntu Linux 网络安全
Linux:使用ntpdate命令同步更新系统时间
Linux:使用ntpdate命令同步更新系统时间
4202 0
|
开发工具 Docker 容器
Docker容器内Permission denied解决方法
Docker容器内Permission denied解决方法
9279 0
|
监控 调度 开发工具
IO神器blktrace使用介绍
## 前言 1. blktrace的作者正是block io的maintainer,开发此工具,可以更好的追踪IO的过程。 2. blktrace 结合btt可以统计一个IO是在调度队列停留的时间长,还是在硬件上消耗的时间长,利用这个工具可以协助分析和优化问题。 ## blktrace的原理 一个I/O请求的处理过程,可以梳理为这样一张简单的图: ![](http://image
20201 0
|
缓存 Linux 调度
CPU 隔离:Nohz_full
SUSE Labs 团队探索了 Kernel CPU 隔离及其核心组件之一:Full Dynticks(或 Nohz Full),并撰写了本系列文章.
1838 0
CPU 隔离:Nohz_full
|
Linux 应用服务中间件 nginx
|
安全 Docker 容器
Docker中运行容器时Operation not permitted报错问题解决
【10月更文挑战第2天】Docker中运行容器时Operation not permitted报错问题解决
5287 3
|
网络协议 NoSQL API
深入理解 RDMA 的软硬件交互机制
本文深入分析了RDMA技术在数据中心高性能网络环境下的工作原理及软硬件交互机制,通过对比传统Kernel TCP,突出了RDMA在减少延迟、提高系统性能方面的优势,同时讨论了其在内存管理、软硬交互方面的关键技术和挑战,为读者提供了全面理解RDMA技术及其应用场景的视角。
|
安全 网络安全 网络虚拟化
IPSec——如何快速搭建IPSec服务
IPSec——如何快速搭建IPSec服务
1428 0
|
Ubuntu Linux C语言
Could not establish connection to “xx.xx.xx.xx“:The VS Code Server faild to start.【重要解决方案】
Could not establish connection to “xx.xx.xx.xx“:The VS Code Server faild to start.【重要解决方案】
1124 0