通过RPM在RedHat8部署systemd服务报错求助:Unit文件不存在
问题原因
你遇到的错误核心原因是:%pre脚本是在RPM包的文件安装到系统之前执行的,这时候toto.service还没被复制到/etc/systemd/system目录,systemctl自然找不到这个单元文件,所以报错。
修正后的.spec文件
%define install_dir /etc/systemd/system %define service toto.service # ---------------------------------------------------------- %install # ---------------------------------------------------------- mkdir -p %{buildroot}/%{install_dir} cp %{service} %{buildroot}/%{install_dir} # 修正服务文件权限,systemd服务文件默认不需要执行权限 chmod 0644 %{buildroot}/%{install_dir}/%{service} # ---------------------------------------------------------- %files # ---------------------------------------------------------- # 采用更合理的权限设置,systemd服务文件通常为0644 %defattr(0644,root,root,0644) %{install_dir}/%{service} # ---------------------------------------------------------- %pre # ---------------------------------------------------------- echo "Installing %{summary} (%{version}-%{release})..." # ---------------------------------------------------------- %post # ---------------------------------------------------------- # 文件已安装完成,现在处理服务启用 echo "Enabling and starting %{service}..." # 重新加载systemd配置,识别新的服务文件 systemctl daemon-reload # 启用并启动服务 systemctl enable %{service} --now # ---------------------------------------------------------- %postun # ---------------------------------------------------------- echo "Uninstalling %{summary} (%{version}-%{release})..." # 仅在完全卸载(不是升级)时执行 if [ $1 -eq 0 ] ; then # 停止并禁用服务 systemctl disable --now %{service} # 重新加载systemd配置,移除已删除的服务文件信息 systemctl daemon-reload fi
关键修改说明
- 移走%pre里的service操作:把服务启用逻辑放到
%post脚本,这个阶段包内文件已经全部安装到系统对应目录,systemctl能找到toto.service。 - 添加systemctl daemon-reload:新安装或删除服务文件后,必须让systemd重新加载配置,否则它无法识别新的服务单元。
- 修正服务文件权限:systemd服务文件不需要执行权限,设置为
0644是标准做法,避免权限过大导致的安全问题。 - 移除%postun里的rm命令:RPM会自动管理包内安装的文件,手动删除会导致RPM数据库和实际系统文件不一致,后续操作可能出问题。
内容的提问来源于stack exchange,提问作者YoYo
相关产品推荐
相关产品推荐

