我有一个软件包,我创建了一个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
解决方法
这与脚本运行的顺序有关:
%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脚本
注意:结束时的出口0;我喜欢专门提到那里,以防万一,因为最后一个命令的不良退出代码将继续并导致脚本退出与该状态,导致安装rpm的问题.
注意:将其固定在新的rpm中不会将其修复到当前安装的rpm中.你会想要用破碎的脚本rpm转动旧的rpm,你会很好的向前移动.
这只是涵盖了前/后脚本;具有触发器的更详细的版本可以是found here.