CentOS 6 - не работает service nginx upgrade

Gena Makhomed gmm на csdoc.com
Вт Апр 4 20:47:27 UTC 2017


Здравствуйте!

CentOS 6 64-bit, nginx из официального репозитория mainline.
При обновлении nginx через yum update с версии 1.11.12 до 1.11.13
не сработала команда service nginx upgrade

Вручную запускаю service nginx upgrade - тоже ничего не работает.

Как выяснилось, причина в том, что service nginx status возвращает
"nginx dead but pid file exists" и завершается с кодом ошибки 1.

Но самое интересное в том, что nginx жив и нормально работает:

# cat /var/run/nginx.pid
13212

# pstree -cp
init(1)─┬─nginx(13212)─┬─nginx(13213)
         │              ├─nginx(13214)
         │              ├─nginx(13215)
         │              ├─nginx(13216)
         │              ├─nginx(13217)
         │              ├─nginx(13219)
         │              ├─nginx(13220)
         │              └─nginx(13221)

# ps aux | grep nginx
root     13212  0.0  0.0  50144  1376 ?        Ss   Mar30   0:00 nginx: 
master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
nginx    13213  0.5  0.3  61812 15056 ?        S<   Mar30  43:15 nginx: 
worker process
nginx    13214  0.5  0.3  62028 15336 ?        S<   Mar30  42:12 nginx: 
worker process
nginx    13215  0.5  0.3  61796 15040 ?        S<   Mar30  41:27 nginx: 
worker process
nginx    13216  0.5  0.3  61776 15028 ?        S<   Mar30  41:44 nginx: 
worker process
nginx    13217  0.5  0.3  61880 15088 ?        S<   Mar30  44:11 nginx: 
worker process
nginx    13219  0.9  0.3  63048 16268 ?        S<   Mar30  75:42 nginx: 
worker process
nginx    13220  0.6  0.3  62284 15504 ?        S<   Mar30  53:42 nginx: 
worker process
nginx    13221  1.0  0.3  62848 16196 ?        S<   Mar30  86:39 nginx: 
worker process

Нашел, причина глюка в том, что:

# echo $(readlink /proc/13212/exe | sed -e 's/\s*(deleted)$//')
(deleted)/usr/sbin/nginx

это фрагмент из функции __pids_var_run() из /etc/init.d/functions
sed ожидает что текст (deleted) будет после имени бинарника,
но тут текст (deleted) оказывается перед именем бинарника
и вся логика работы функции __pids_var_run() ломается.

if [ -n "$binary" ] ; then
         local b=$(readlink /proc/$p/exe | sed -e 's/\s*(deleted)$//')
         [ "$b" != "$binary" ] && continue
fi
pid="$pid $p"

(deleted)/usr/sbin/nginx не равно /usr/sbin/nginx
и поэтому __pids_var_run() думает что процесса нет.

Получается, что ошибка в файле /etc/rc.d/init.d/functions
из базового пакета initscripts-9.03.53-1.el6.centos.2.x86_64
из состава CentOS 6 / RHEL6 ?

Или же этот глюк специфичен только для OpenVZ версии ядра,
и на нормальном ядре из состава CentOS 6 все нормально?

-- 
Best regards,
  Gena



Подробная информация о списке рассылки nginx-ru