PHP-FPM RC SCRIPT и Error in PREUN scriptlet in rpm package в CetnOS 5

archive view archive save

article rpm -e --nodeps php-fpm - error reading information on service php-fpm: No such file or directory, error: %preun(php-fpm-5.4.20-26.el5.art.i386) scriptlet failed, exit status 1. yum remove php-fpm - error reading information on service php-fpm: No such file or directory, Error in PREUN scriptlet in rpm package p.

Уже как-то говорил, что автоматическое обновление чревато возникновением различных, извините, "геморроев", на лечение которых можно потратить много времени, а особенно в тех случаях когда сервер автоматически обновлялся длительное время, то после его перезагрузки можно получить кучу сюрпризов.

Вот очередной сюрприз появился после обновления PHP-FPM в CentOS 5... Пропал стартовый RC для PHP-FPM и как результат после очередной перезагрузки сервис не был запущен.

Попытки удалить/переустановить приводили к уже упомянутым выше ошибкам:

# Сохраним конфиги
cp -r /etc/php-fpm.d /etc/php-fpm.d_bak
 
yum remove php-fpm
...
error reading information on service php-fpm: No such file or directory, 
Error in PREUN scriptlet in rpm package p
Removed:
  php-fpm.i386 0:5.4.20-26.el5.art
Complete!
 
rpm -e --nodeps php-fpm
...
error reading information on service php-fpm: No such file or directory, 
error: %preun(php-fpm-5.4.20-26.el5.art.i386) scriptlet failed, exit status 1

Как видим после "yum remove", невзирая на ошибку выполнения scriptlet-а, нам выдали "Removed Complete!", но этот пакет всё ещё продолжает висеть в системе:

rpm -qa | grep php-fpm
php-fpm-5.4.20-26.el5.art

Хорошо, удаляем без выполнения scriptlet-ов и пробуем переустановить:

rpm -e php-fpm --noscripts
 
yum -y install php-fpm
...
Running Transaction
  Installing     : php-fpm                                                  1/1
error reading information on service php-fpm: No such file or directory
Non-fatal POSTIN scriptlet failure in rpm package php-fpm-5.4.20-26.el5.art.i386
error: %post(php-fpm-5.4.20-26.el5.art.i386) scriptlet failed, exit status 1
 
Installed:
  php-fpm.i386 0:5.4.20-26.el5.art
 
Complete!

Теперь уже ошибка, хотя и не фатальная, в "пост" установочном скрипте - посмотрим же на них:

rpm -q --scripts php-fpm

preinstall scriptlet (using /bin/sh):
# Add the "apache" user as we don't require httpd
getent group  apache >/dev/null || \
  groupadd -g 48 -r apache
getent passwd apache >/dev/null || \
  useradd -r -u 48 -g apache -s /sbin/nologin \
    -d /var/www -c "Apache" apache
exit 0
postinstall scriptlet (using /bin/sh):
if [ $1 = 1 ]; then
    # Initial installation
    /sbin/chkconfig --add php-fpm
fi
preuninstall scriptlet (using /bin/sh):
if [ $1 = 0 ]; then
    # Package removal, not upgrade
    /sbin/service php-fpm stop >/dev/null 2>&1
    /sbin/chkconfig --del php-fpm
fi
postuninstall scriptlet (using /bin/sh):
if [ $1 -ge 1 ]; then
    /sbin/service php-fpm condrestart >/dev/null 2>&1 || :
fi

# Handle upgrading from SysV initscript to native systemd unit.
# We can tell if a SysV version of php-fpm was previously installed by
# checking to see if the initscript is present.

Ага..., вот "postinstall scriptlet" пытается добавить в список доступных сервисов "/sbin/chkconfig --add php-fpm", но не может этого сделать ибо нет стартового RC скрипта "error reading information on service php-fpm: No such file or directory".

Пакет устанавливался, а потом и обновлялся, из репозитория atomic, но предыдущая версия содержала стартовый init скрипт, а после обновления пакета его как корова языком слизала. Благо, что имеется такая привычка делать "бэкапы" из которых ниже приведён стартовый RC скрипт для PHP-FPM из CentOS 5:

vi /etc/rc.d/init.d/php-fpm
#! /bin/sh
#
# chkconfig: - 84 16
# description:  PHP FastCGI Process Manager
# processname: php-fpm
# config: /etc/php-fpm.conf
# pidfile: /var/run/php-fpm/php-fpm.pid
 
# Standard LSB functions
#. /lib/lsb/init-functions
 
# Source function library.
. /etc/init.d/functions
 
# Check that networking is up.
. /etc/sysconfig/network
 
# Additional environment file
if [ -f /etc/sysconfig/php-fpm ]; then
      . /etc/sysconfig/php-fpm
fi
 
if [ "$NETWORKING" = "no" ]
then
  exit 0
fi
 
RETVAL=0
prog="php-fpm"
pidfile=${PIDFILE-/var/run/php-fpm/php-fpm.pid}
lockfile=${LOCKFILE-/var/lock/subsys/php-fpm}
 
start () {
    echo -n $"Starting $prog: "
 dir=$(dirname ${pidfile})
   [ -d $dir ] || mkdir $dir
   daemon --pidfile ${pidfile} php-fpm --daemonize
 RETVAL=$?
   echo
    [ $RETVAL -eq 0 ] && touch ${lockfile}
}
stop () {
    echo -n $"Stopping $prog: "
 killproc -p ${pidfile} php-fpm
  RETVAL=$?
   echo
    if [ $RETVAL -eq 0 ] ; then
     rm -f ${lockfile} ${pidfile}
    fi
}
 
restart () {
        stop
        start
}
 
reload () {
    echo -n $"Reloading $prog: "
    killproc -p ${pidfile} php-fpm -USR2
    RETVAL=$?
   echo
}
 
 
# See how we were called.
case "$1" in
  start)
  start
   ;;
  stop)
   stop
    ;;
  status)
 status -p ${pidfile} php-fpm
    RETVAL=$?
   ;;
  restart)
    restart
 ;;
  reload|force-reload)
    reload
  ;;
  condrestart|try-restart)
    [ -f ${lockfile} ] && restart || :
  ;;
  *)
  echo $"Usage: $0 {start|stop|status|restart|reload|force-reload|condrestart|try-restart}"
   RETVAL=2
        ;;
esac
 
exit $RETVAL
 

После того, как создали /etc/rc.d/init.d/php-fpm, даём ему "чмоды" на выполнение, добавляем php-fpm в список служб и разрешаем автозапуск:

ls -la /etc/init.d/
....
-rwxr-xr-x 1 root root 2020 Jul 15 2010 pcscd
-rw-r--r-- 1 root root 1495 Oct 8 21:17 php-fpm
-rwxr-xr-x 1 root root 1877 Jan 6 2007 portmap
 
chmod 755 /etc/rc.d/init.d/php-fpm
chkconfig --add php-fpm
chkconfig php-fpm on

Повторная установка/удаление пакета "php-fpm.i386 0:5.4.20-26.el5.art" проходила успешно и почему-то не затрагивая стартовый RC скрипт /etc/rc.d/init.d/php-fpm - т.е. после удаления пакета стартовый скрипт не был удалён.

Видимо тот, кто собирал пакет протупил и забыл добавить стартовый RC скрипт /etc/rc.d/init.d/php-fpm или может, что вряд ли, это меня дивным образом проглючило...

Олег Головский


Комментарии в блоге
Новое на форуме