Почему остановка сервиса после обновления RPM

У меня есть программный пакет, для которого я создал RPM. Я не могу вставить весь RPM здесь по причинам IP, но вот суть проблемы:

%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

Это связано с порядком запуска скриптов:

%pre of new package
(package install)
%post of new package
%preun of old package
(removal of old package)
%postun of old package

Таким образом, в вашем случае %preun старого rpm запускается последним, что отключает службу.

Это можно решить, посмотрев аргумент на сообщение script. Вот таблица для значения:

          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 script был следующим:

%preun
if [ "$1" = "0" ]; then
    /sbin/service program stop
    /sbin/chkconfig program off
fi
exit 0

Это остановит программу только при полной деинсталляции (т.е. rpm -e) и сделает это за вас.

ПРИМЕЧАНИЕ: вы также захотите сделать то же самое со своим %postun script

ПРИМЕЧАНИЕ: exit 0 в конце; Я хотел бы специально указать, что на всякий случай, так как плохой код выхода из последней команды будет переноситься и вывести script с этим статусом, что вызовет проблемы с установкой rpm.

ПРИМЕЧАНИЕ: исправление этого параметра в новых rpm не устраняет его в текущем установленном числе оборотов. Вы захотите rpm -e старую rpm со сломанным script, и вы будете хорошо двигаться вперед.

Это просто охватывает сценарии pre/post; более детальную версию с триггерами и т.д. можно найти здесь.