3.4. 在 Software Collections 中管理服务
在打包软件集合时,请确保用户可以直接管理 Software Collection 提供的任何服务(守护进程),或使用系统默认工具(如 service 或 chkconfig on Red Hat Enterprise Linux 6)或 systemctl on Red Hat Enterprise Linux 7。
对于 Red Hat Enterprise Linux 6 中的 Software Collections,请确保调整 spec 文件的
%install
部分,以避免与 Software Collection 一部分的服务的系统版本冲突:
%install install -p -c -m 644 %{SOURCE2} $RPM_BUILD_ROOT%{?scl:%_root_sysconfdir}%{!?scl:%_sysconfdir}/rc.d/init.d/%{?scl_prefix}service_name
使用服务的实际名称替换 service_name。
对于 Red Hat Enterprise Linux 7 中的 Software Collections,请按如下所示调整 spec 文件的
%install
部分:
%install install -p -c -m 644 %{SOURCE2} $RPM_BUILD_ROOT%{_unitdir}/%{?scl_prefix}service_name.service
使用这个配置,您可以引用 Software Collection 中包含的服务版本,如下所示:
%{?scl_prefix}service_name
请记住,没有环境变量从用户的环境传播到 SysV init 脚本(或 Red Hat Enterprise Linux 7 上的 systemd 服务文件)。这是预期的,并确保服务始终在干净环境中启动。但是,这需要您为由 SysV 初始化脚本(或 systemd 服务文件)运行的进程正确设置 Software Collection 环境。
3.4.1. 为服务配置环境
建议您使您要为服务启用的软件集合进行配置。本节中的指示演示了如何使软件集合配置名为 software_collection。
过程 3.2. 为 Red Hat Enterprise Linux 6 上的服务配置环境
- 在
/opt/provider/software_collection/service-environment
中创建包含以下内容的配置文件:[SCLNAME]_SCLS_ENABLED="software_collection"
将 SCLNAME 替换为软件集合的唯一标识符,例如,您的 Software Collection 使用大写字母编写的名称。将 software_collection 替换为%scl_name
宏定义的 Software Collection 的名称。 - 在 SysV init 脚本的开头添加以下行:
source /opt/provider/software_collection/service-environment
- 在 SysV init 脚本中,确定运行位于
/opt/provider/
文件系统层次结构中的二进制文件的命令。使用 scl enable $[SCLNAME]_SCLS_ENABLED 为这些命令添加前缀,类似于在 Software Collection 环境中运行命令。例如,替换以下行:/usr/bin/daemon_binary --argument-1 --argument-2
使用:scl enable $[SCLNAME]_SCLS_ENABLED -- /usr/bin/daemon_binary --argument-1 --argument-2
- 有些命令(如 su 或 runuser )也清除环境变量。因此,如果在 SysV init 脚本中使用这些命令,请在运行这些命令后再次启用您的 Software Collection。例如,替换以下行:
su - user_name -c '/usr/bin/daemon_binary --argument-1 --argument-2'
使用:su - user_name -c '\ source /opt/provider/software_collection/service-environment \ scl enable $SCLNAME_SCLS_ENABLED -- /usr/bin/daemon_binary --argument-1 --argument-2'
过程 3.3. 为 Red Hat Enterprise Linux 7 中的服务配置环境
- 在
/opt/provider/software_collection/service-environment
中创建包含以下内容的配置文件:[SCLNAME]_SCLS_ENABLED="software_collection"
将 SCLNAME 替换为软件集合的唯一标识符,例如,您的 Software Collection 使用大写字母编写的名称。将 software_collection 替换为%scl_name
宏定义的 Software Collection 的名称。 - 在 systemd 服务文件中添加以下行以载入配置文件:
EnvironmentFile=/opt/provider/software_collection/service-environment
- 在 systemd 服务文件中,使用 scl enable $[SCLNAME]_SCLS_ENABLED,与在 Software Collection 环境中运行命令的
ExecStartPre
、ExecStart
和类似的指令中加上前缀:ExecStartPre=/usr/bin/scl enable $[SCLNAME]_SCLS_ENABLED -- /opt/provider/software_collection/root/usr/bin/daemon_helper_binary --argument-1 --argument-2 ExecStart=/usr/bin/scl enable $[SCLNAME]_SCLS_ENABLED -- /opt/provider/software_collection/root/usr/bin/daemon_binary --argument-1 --argument-2
警告
前缀带有 scl enable ... 的 scl 的命令将阻止服务转换到 SELinux 策略所表示的目标 SELinux 上下文无效。
如果使用 SELinux 限制该服务,systemd 服务文件需要直接执行二进制文件。如果二进制文件与作为 Software Collection 一部分的共享库相关联,DT_RUNPATH
属性可帮助在运行时访问这些共享库,而无需使用 scl enable ... wrapper。请参阅 第 3.15.1 节 “Red Hat Enterprise Linux 7 中的 SELinux 支持” 了解更多信息。