我有一个软件包,我为其创建了一个RPM。由于IP原因,我无法粘贴整个RPM,但这是问题的要点:
%pre
/sbin/pidof program
if [ "$?" -eq "0" ]
then
/sbin/service program stop
fi
%post
/sbin/chkconfig program on
/sbin/service program start
%preun
/sbin/service program stop
/sbin/chkconfig program off
%postun
rm -rf /program_folder
每当我尝试升级软件包时,它会停止程序服务,安装所有内容,启动服务,然后再次停止它并删除文件夹......任何想法?
答案 0 :(得分:26)
这与脚本的运行顺序有关:
%pre of new package
(package install)
%post of new package
%preun of old package
(removal of old package)
%postun of old package
因此,在您的情况下,旧rpm的%preun
最后运行,这会关闭服务。
这可以通过查看post脚本的参数来解决。以下是值表:
install upgrade uninstall
%pre $1 == 1 $1 == 2 (N/A)
%post $1 == 1 $1 == 2 (N/A)
%preun (N/A) $1 == 1 $1 == 0
%postun (N/A) $1 == 1 $1 == 0
所以,你希望你的%postun
脚本改为:
%preun
if [ "$1" = "0" ]; then
/sbin/service program stop
/sbin/chkconfig program off
fi
exit 0
这将使它仅在完全卸载时停止程序(即; rpm -e
)并且应该为您完成。
注意:您也希望对%postun
脚本执行相同的操作
注意:最后的exit 0
;我想特意把它放在以防万一,因为上一个命令的错误退出代码将继续并导致脚本以该状态退出,导致rpm安装出现问题。
注意:在新rpm中修复此问题并未将其修复为当前安装的rpm。你需要用破旧的脚本rpm -e
旧的rpm,你会很好地前进。
这只包括前/后脚本;带触发器的更详细版本可以是found here。