为什么RPM更新后服务停止

时间:2012-01-13 17:45:26

标签: redhat 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

每当我尝试升级软件包时,它会停止程序服务,安装所有内容,启动服务,然后再次停止它并删除文件夹......任何想法?

1 个答案:

答案 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