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

时间: 2025-01-21 13:04:05

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

linux安装rpm包时遇到Failed dependencies

  初学linux,把今天遇到问题的解决方法贴出来 环境:Centos 5.5 + MySQL-server-5.5.24-1.linux2.6.x86_64.rpm 遇到的问题: [root@sh158-xen data]#rpm -ivh MySQL-server-5.5.24-1.linux2.6.x86_64.rpm error: Failed dependencies: MySQL conflicts with mysql-5.0.77-4.el5_4.2.x86_64 纠结了半天,终

Linux源码包制作RPM包之Apache

公司服务器比较多,需要把apache源码包制作成rpm包,然后放到公司内网yum源上进行下载安装.apache的rpm包安装方式比源码安装方式比较快,这能节约不少的时间. 有关内网yum源的搭建,可以参考<烂泥:yum的使用及配置>这篇文章. 一.安装rpm-build 查阅相关资料得知,要把源码包制作成rpm包需要使用rpm打包工具rpm-build. rpm-build通过rpmbuild命令根据本地源码包,通过spec文件中的规则就可以把源码包制作成rpm包. 现在我们来安装rpm-bu

YUM解决RPM包安装依赖关系及yum工具介绍本地源配置方法详解_Linux

1.背景概述 在实际生产环境下,对于在linux系统上安装rpm包,主要面临两个实际的问题 1)安装rpm包过程中,不断涌现的依赖关系问题,导致需要按照提示或者查询资料,手工安装更多的包 2)由于内外网的隔离,无法连接外网的yum源 鉴于上述因此,本文将详细介绍,yum工具以及配置本地yum源的方法 2.yum工具简介 •yum工具作为rpm包的软件管理器,可以进行rpm包的安装.升级以及删除等日常管理工作,而且对于rpm包之间的依赖关系可以自动分析,大大简化了rpm包的维护成本. •yum工具

linux 下载一个rpm包

RPM是"Redhat Package Manager"的缩写,根据名字也能猜到这是Redhat公司开发出来的. 1. 安装yum-downloadonly sudo yum -y install yum-downloadonly sudo yum -y install --downloadonly 软件名字 2. 1)安装 -i :安装的意思 -v :可视化 -h :显示安装进度 另外在安装一个rpm包时常用的附带参数有: --force 强制安装,即使覆盖属于其他包的文件也要安装

yum命令使用指南:添加、删除和更新RPM包

Yum(全称为 Yellow dog http://www.aliyun.com/zixun/aggregation/34037.html">Updater, Modified)是一个在Fedora和RedHat以及SUSE.CentOS中的Shell前端软件包管理器.基於RPM包管理,能够从指定的服务器自动下载RPM包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软体包,无须繁琐地一次次下载.安装. 软体包来源 可供Yum下载的软体包包括Fedora本身的软体包以及源自rpmf

制作nginx的RPM包教程_nginx

本文讲述了制作nginx的RPM包的方法,实例如下: 1. 下载nginx源码,直接运行命令: cd /root wget http://nginx.org/download/nginx-1.7.1.tar.gz 在拿到源码包之后,解压,并进入目录: tar zxvf nginx-1.7.1.tar.gz cd nginx-1.7.1 2. 编写SPEC文件 文件名为:nginx.spec Summary: High Performance Web Server Name: nginx Vers

Redhat下安装RPM包管理工具介绍

一.安装 命令格式: rpm -i ( or --install) options file1.rpm ... fileN.rpm 参数: file1.rpm ... fileN.rpm 将要安装的RPM包的文件名 详细选项: -h (or --hash) 安装时输出hash记号 (``#'') --test 只对安装进行测试,并不实际安装. --percent 以百分比的形式输出安装的进度. --excludedocs 不安装软件包中的文档文件 --includedocs 安装文档 --rep

在CentOS中用yum命令下载RPM包但不进行安装的方法

  yum是基于Red Hat的系统(如CentOS.Fedora.RHEl)上的默认包管理器.使用yum,你可以安装或者更新一个RPM包,并且他会自动解决包依赖关系.但是如果你只想将一个RPM包下载到你的系统上该怎么办呢? 例如,你可能想要获取一些RPM包在以后使用,或者将他们安装在另外的机器上. 这里说明了如何从yum仓库上下载一个RPM包. 方法一:yum yum命令本身就可以用来下载一个RPM包,标准的yum命令提供了--downloadonly(只下载)的选项来达到这个目的. 代码如下

RHCE学习&lt;3&gt;NFS、Samba、ACL权限、SELinux和RPM包管理

一.NFS网络文件共享服务 1.简单介绍 NFS包含3个版本:NFSv2.NFSv3.NFSv4 RHEL6是以NFSv4作为默认版本,NFSv4使用TCP协议,默认NFS占用5个端口,1个NFS端口(2049),四个动态端口,而老版本的NFS可以在TCP协议或者是UDP协议上运行. /etc/exports:NFS服务的主配置文件,该文件的最主要目的是发布共享目录并为共享目录限制权限. /var/lib/nfs/xtab:这个文件主要用来记录客户端与NFS服务器的连接记录. 格式:共享目录 客