为什么RPM更新后服务停止

Sag*_*gar 11 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
Run Code Online (Sandbox Code Playgroud)

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

Cor*_*son 26

这与脚本运行的顺序有关:

%pre of new package
(package install)
%post of new package
%preun of old package
(removal of old package)
%postun of old package
Run Code Online (Sandbox Code Playgroud)

因此,在您的情况下,%preun旧rpm的最后一次运行会关闭服务.

这可以通过查看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
Run Code Online (Sandbox Code Playgroud)

所以,你希望你的%postun脚本改为:

%preun
if [ "$1" = "0" ]; then
    /sbin/service program stop
    /sbin/chkconfig program off
fi
exit 0
Run Code Online (Sandbox Code Playgroud)

这将使它仅在完全卸载(即; rpm -e)时停止程序,并且应该为您完成.

注意:您也希望对%postun脚本执行相同的操作

注意:exit 0最后; 我想特意把它放在以防万一,因为最后一个命令的错误退出代码将继续并导致脚本以该状态退出,导致rpm安装出现问题.

注意:在新rpm中修复此问题并未将其修复为当前安装的rpm.你会想要rpm -e用破旧的脚本来保存旧的rpm,你会很好地向前发展.

这只包括前/后脚本; 有触发器的更详细版本可以在这里找到.