首页 > 解决方案 > systemctl 启动服务在 SPEC 文件中不起作用

问题描述

我遇到一个问题,升级我的 RPM 包时,我的 SPEC 文件中的命令“sudo systemctl start xxx.service”不起作用,以下是我在 SPEC 文件中的 %post 脚本,

%post
echo "---------------------------- post $1 -------------------------------"
# refresh installation
if [ $1 == 1 ]; then
  sudo echo "Installation finished."
# upgrade installation
elif [ $1 -gt 1 ]; then
  sudo echo "Starting service xxx.service..."
  sudo /usr/bin/systemctl enable xxx.service > /dev/null 2>&1
  sudo /usr/bin/systemctl start xxx.service
  sleep 10
  sudo echo "Finished."
fi
exit 0

我确定服务文件已经存在于目录 /usr/lib/systemd/system 中,我可以使用命令“sudo systemctl start xxx.service”手动启动它。

而且我发现“sleep 10”命令也不起作用。

如果对这个问题有任何建议,非常感谢,谢谢。

标签: rhelrpm-specsystemctl

解决方案


几个问题:

  • 您不应该sudo在 scriplets 中使用,因为 1)它可能没有安装 2)rpm 安装无论如何都以超级用户身份运行
  • 您应该为 SystemD使用标准RPM 宏,而不是重新发明轮子。

本质上,这只是归结为:

%{?systemd_requires}
BuildRequires: systemd

# ...

%post
%systemd_post %{name}.service

%preun
%systemd_preun %{name}.service

%postun
%systemd_postun_with_restart %{name}.service

# ...

请注意,用于 CentOS/RHEL 的 SystemD 宏位于systemd软件包中,而在 Fedora 中它们现在位于systemd-rpm-macros.


推荐阅读