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 или может, что вряд ли, это меня дивным образом проглючило...