6.3. 支持文件触发器


文件触发器RPM scriptlets 的一种类型,

在软件包的 spec 文件中定义。

触发器 类似,它们在一个软件包中声明,但在安装或删除包含匹配文件的其他软件包时执行。

文件触发器的常见用法 是更新 registry 或缓存。在这种用例中,包含或管理注册表或缓存的软件包还应包含一个或多个文件 触发器。与软件包控制更新本身的情况相比,包括 文件触发器 可节省时间。

6.3.1. 文件触发器语法

文件触发器 使用以下语法:

%file_trigger_tag [FILE_TRIGGER_OPTIONS] — PATHPREFIX…​
body_of_script
Copy to Clipboard Toggle word wrap

其中:

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
Copy to Clipboard Toggle word wrap

在安装包含以 /usr/lib/lib 开头的文件的软件包安装后,此文件触发器直接执行 /usr/bin/ldconfig。即使软件包包含多个以 /usr/lib/lib 开头的路径,文件触发器也会执行一次。但是,以 /usr/lib/lib 开头的所有文件名都传递给触发器脚本的标准输入,以便您可以在脚本内过滤,如下所示:

%filetriggerin — /lib, /lib64, /usr/lib, /usr/lib64
grep "foo" && /usr/sbin/ldconfig
Copy to Clipboard Toggle word wrap

此文件触发器对每个包含 /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 来确保这一点:

%transfiletriggerin common -P 2000000 — /lib /usr/lib /lib64 /usr/lib64
/sbin/ldconfig
%end
%transfiletriggerpostun common -P 2000000 — /lib /usr/lib /lib64 /usr/lib64
/sbin/ldconfig
%end
Copy to Clipboard Toggle word wrap

因此,如果您安装或卸载多个软件包,则会在整个事务完成后为所有已安装的库更新 ldconfig 缓存。因此,不再需要将 scriptlets 调用 ldconfig 包含在各个软件包的 RPM spec 文件中。与 RHEL 7 相比,这提高了性能,其中为每个软件包单独更新缓存。

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat