6.3. 支持文件触发器
文件触发器
是 RPM scriptlets 的一种类型,
在软件包的 spec
文件中定义。
与 触发器 类似,它们在一个软件包中声明,但在安装或删除包含匹配文件的其他软件包时执行。
文件触发器的常见用法
是更新 registry 或缓存。在这种用例中,包含或管理注册表或缓存的软件包还应包含一个或多个文件 触发器
。与软件包控制更新本身的情况相比,包括 文件触发器
可节省时间。
6.3.1. 文件触发器语法 复制链接链接已复制到粘贴板!
文件触发器
使用以下语法:
%file_trigger_tag [FILE_TRIGGER_OPTIONS] — PATHPREFIX… body_of_script
%file_trigger_tag [FILE_TRIGGER_OPTIONS] — PATHPREFIX…
body_of_script
其中:
file_trigger_tag
定义文件触发器类型。允许的类型是:
-
filetriggerin
-
filetriggerun
-
filetriggerpostun
-
transfiletriggerin
-
transfiletriggerun
-
transfiletriggerpostun
FILE_TRIGGER_OPTIONS
的用途与 RPM 脚本设置选项相同,但 -P
选项除外。
触发器的优先级由数字定义。文件触发器脚本的越大,执行文件触发器脚本的时间就越早。优先级大于 100000 的触发器在标准脚本允许之前执行,其他触发器在标准脚本允许后执行。默认优先级设置为 1000000。
每个类型的文件触发器都必须包含一个或多个路径前缀和脚本。
6.3.2. 文件触发器语法示例 复制链接链接已复制到粘贴板!
以下示例显示了 文件触发器
语法:
%filetriggerin — /lib, /lib64, /usr/lib, /usr/lib64 /usr/sbin/ldconfig
%filetriggerin — /lib, /lib64, /usr/lib, /usr/lib64
/usr/sbin/ldconfig
在安装包含以 /usr/lib
或 /lib
开头的文件的软件包安装后,此文件触发器直接执行 /usr/bin/ldconfig
。即使软件包包含多个以 /usr/lib
或 /lib
开头的路径,文件触发器也会执行一次。但是,以 /usr/lib
或 /lib
开头的所有文件名都传递给触发器脚本的标准输入,以便您可以在脚本内过滤,如下所示:
%filetriggerin — /lib, /lib64, /usr/lib, /usr/lib64 grep "foo" && /usr/sbin/ldconfig
%filetriggerin — /lib, /lib64, /usr/lib, /usr/lib64
grep "foo" && /usr/sbin/ldconfig
此文件触发器对每个包含 /usr/lib
文件的软件包执行 /usr/bin/ldconfig
,同时包含 foo
。请注意,前缀匹配的文件包括所有类型的文件,包括常规文件、目录、符号链接等。
6.3.3. 文件触发器类型 复制链接链接已复制到粘贴板!
文件触发器
有两个主要类型:
文件触发器
会根据执行时间进一步划分,如下所示:
- 软件包的之前或后,或之后
- 事务前后
6.3.3.1. 每个软件包文件触发器执行一次 复制链接链接已复制到粘贴板!
每个软件包执行一次文件触发器
为:
- %filetriggerin
- %filetriggerun
- %filetriggerpostun
%filetriggerin
如果此软件包包含与此触发器前缀匹配的一个或多个文件,则该文件触发器会在软件包安装后执行。它还在安装包含此文件触发器的软件包后执行,并且与 rpmdb
数据库中此文件的前缀匹配的一个或多个文件。
%filetriggerun
如果此软件包包含与此触发器前缀匹配的一个或多个文件,则在卸载软件包前执行此文件触发器。它还在卸载包含此文件触发器的软件包之前执行,且与 rpmdb
中此文件的前缀匹配有一个或多个文件。
%filetriggerpostun
如果此软件包包含与此触发器前缀匹配的一个或多个文件,则该文件触发器会在卸载软件包后执行。
6.3.3.2. 每个事务文件触发器执行一次 复制链接链接已复制到粘贴板!
每个事务执行一次的文件 触发器
为:
- %transfiletriggerin
- %transfiletriggerun
- %transfiletriggerpostun
%transfiletriggerin
对于包含此触发器前缀的一个或多个文件,在事务后执行此文件触发器。如果该事务中有包含此文件触发器的软件包,并且 rpmdb
中此触发器的前缀有一个或多个与这个触发器的前缀匹配的文件,它也在事务后执行。
%transfiletriggerun
此文件触发器会在满足以下条件的所有软件包的事务前执行一次:
- 这个事务中会卸载软件包
- 软件包包含一个或多个与这个触发器前缀匹配的文件
如果该事务中有包含此文件触发器的软件包,且 rpmdb
中与此触发器的前缀匹配了一个或多个文件,则它也会在事务前执行。
%transfiletriggerpostun
对于包含此触发器前缀的一个或多个文件的所有卸载软件包的事务后,会执行一次此文件触发器。
此触发器类型中没有触发文件的列表。
因此,如果您安装或卸载包含库的多个软件包,则会在整个事务结束时更新 ldconfig 缓存。与 RHEL 7 相比,与为每个软件包单独更新缓存时,这可以显著提高性能。另外,不再需要在每个软件包的 spec
文件中称为 ldconfig 中的 scriptlet 和 %postun。
6.3.4. 在 glibc 中使用文件触发器示例 复制链接链接已复制到粘贴板!
以下示例显示了 glibc
软件包中 文件触发器
的实际用法。
在 RHEL 8 中,文件触发器
在 glibc
中实现,以在安装或卸载事务结束时调用 ldconfig
命令。
通过在 glibc 的
SPEC 文件中包括以下 scriptlets 来确保这一点:
因此,如果您安装或卸载多个软件包,则会在整个事务完成后为所有已安装的库更新 ldconfig
缓存。因此,不再需要将 scriptlets 调用 ldconfig
包含在各个软件包的 RPM spec
文件中。与 RHEL 7 相比,这提高了性能,其中为每个软件包单独更新缓存。