Opened 9 years ago
Closed 8 years ago
#953 closed defect (fixed)
Error on logrotate when Nginx is stopped
Reported by: | Owned by: | ||
---|---|---|---|
Priority: | minor | Milestone: | |
Component: | nginx-package | Version: | 1.9.x |
Keywords: | Cc: | ||
uname -a: | Linux - 2.6.32-573.18.1.el6.x86_64 #1 SMP Wed Jan 6 11:20:49 EST 2016 x86_64 x86_64 x86_64 GNU/Linux | ||
nginx -V: |
nginx version: nginx/1.7.9
built by gcc 4.4.7 20120313 (Red Hat 4.4.7-3) (GCC) TLS SNI support enabled configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_random_index_module --with-http_secure_link_module --with-http_stub_status_module --with-http_auth_request_module --with-mail --with-mail_ssl_module --with-file-aio --with-ipv6 --with-http_spdy_module --with-cc-opt='-O2 -g -pipe -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic' |
Description
Steps to reproduce:
- Start Nginx
- Have some traffic on Nginx (logs must not be empty)
- Stop Nginx
- Logrotate is executed (can be forced)
Expected results:
No error, Nginx will not be reloaded since it is not running anyway.
Actual results:
The following error is returned:
[root@dev logrotate.d]# /etc/init.d/nginx stop Stopping nginx: [ OK ] [root@dev logrotate.d]# logrotate --force nginx error: error running shared postrotate script for '/var/log/nginx/*.log '
This happens because the &&
operator does not work exactly like an if/then
statement, anything after &&
is executed and the final result is then computed. Because of this, it tries to do cat /var/run/nginx.pid
even if this file does not exist.
Current logrotate configuration /etc/logrotate.d/nginx
:
postrotate [ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid` endscript
Proposed logrotate configuration:
postrotate if [ -f /var/run/nginx.pid ]; then kill -USR1 `cat /var/run/nginx.pid` fi endscript
Change History (2)
comment:1 by , 9 years ago
Component: | other → nginx-package |
---|---|
Status: | new → accepted |
comment:2 by , 8 years ago
Resolution: | → fixed |
---|---|
Status: | accepted → closed |
Patch with || true
will not work correctly if pid file exists, but has a wrong pid within - logrotate should return error in this case, but it will end silently. Patch with originally proposed approach was committed.
Thanks for the report, the error clearly shouldn't be reported in this situation. The explanation why the error happens you've suggested looks wrong though.
According to POSIX, the
&&
operator is not expected to execute any commands unless previous commands returned zero, see here.The "error running shared postrotate script..." message appears for a different reason: the postrotate script returns non-zero exit status if there is no pid file, and logrotate sees it and complains. Adding
|| true
to the script should fix it.Patch for the package repository: