rhel - 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”命令也不起作用。
如果对这个问题有任何建议,非常感谢,谢谢。
解决方案
几个问题:
- 您不应该
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
.
推荐阅读
- class - 继承类扩展
- php - 为什么 Formidable Pro 中的 PHP/MySQL COUNT 不工作?
- node.js - 使用 Express 对 Twitter 帐户进行身份验证时传递类似状态的数据
- swift - 使用主队列中的 Dispatch 一次调用一个函数
- express - 猫鼬 findByIdAndDelete
- django - Django Rest Framework:支持任意 HTTP 动词的视图?
- python-3.x - 如何在一次读取两个文件时实现并发并对获取的数据做一些事情
- angular - Angular 8 到 9,无法将服务导入使用继承的类
- python - 是否可以完全在 Python 中运行/管理/修改程序的功能?
- c - 如何从包含空格分隔的字符串和整数的用户那里获取输入?