2012-01-13 58 views
10

我有一个软件包,我为其创建了一个RPM。我不能在这里粘贴整个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

我认为这个问题属于http://superuser.com/ – Cyclonecode 2012-01-13 17:50:21

+2

我认为这仍然是一个编程问题,因为它处理rpm脚本。 – 2012-01-13 19:23:10

回答

24

这既有这些脚本的运行顺序做:

%pre of new package 
(package install) 
%post of new package 
%preun of old package 
(removal of old package) 
%postun of old package 
你的情况

因此,老转的%preun是上次运行,其中关闭该服务。

这可以通过查看帖子脚本的参数来解决。下面是值的表:

  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与破损脚本的旧转速,你会很好前进。

这只是涵盖了前/后脚本;带有触发器的更详细的版本可以是found here

+0

非常感谢!这使得它更清晰。我一直在看一些网站,每个人都解释了顺序,但我无法找到任何关于参数值的信息 - 也许是盲目的。我会尝试一下并尽快回传。 – Sagar 2012-01-13 19:56:50

+0

工作,谢谢!另外,感谢您的链接! – Sagar 2012-01-17 15:13:52