nginx logrotate error en el trabajo cron

10

Estoy ejecutando Ubuntu 14.04 LTS y nginx en un Digital Ocean VPS y ocasionalmente recibo estos correos electrónicos sobre un trabajo cron fallido:

Tema

Prueba de Cron -x / usr / sbin / anacron || (cd / && run-parts --report /etc/cron.daily)

El cuerpo del correo electrónico es:

/etc/cron.daily/logrotate: error: error al ejecutar el script postrotate compartido para '/var/log/nginx/*.log' run-parts: /etc/cron.daily/logrotate salió con el código de retorno 1

¿Alguna idea sobre cómo puedo resolver esto?

Actualizar:

/var/log/nginx/*.log {
  weekly
  missingok 
  rotate 52 
  compress 
  delaycompress
  notifempty 
  create 0640 www-data adm
  sharedscripts
  prerotate
      if [ -d /etc/logrotate.d/httpd-prerotate ]; then \
          run-parts /etc/logrotate.d/httpd-prerotate; \
      fi
  endscript 
  postrotate 
      invoke-rc.d nginx rotate >/dev/null 2>&1
  endscript 
}

Actualizar:

$ sudo invoke-rc.d nginx rotate
initctl: invalid command: rotate
Try `initctl --help' for more information.
Chris
fuente
parece que no puede ejecutar lo que se especifica como la acción de postrotación, muéstranos tu /etc/logrotate.d/nginixscript
X Tian
/var/log/nginx/*.log {semanalmente missingok rotar 52 comprimir delaycompress notifempty crear 0640 www-data adm sharedscripts prerotate if [-d /etc/logrotate.d/httpd-prerotate]; entonces \ run-parts /etc/logrotate.d/httpd-prerotate; \ fi \ endscript postrotate invoke-rc.d nginx rotate> / dev / null 2> & 1 endscript}
Chris
1
Es normal actualizar su pregunta con más información cuando se le solicite. 4 espacios al comienzo de cada línea lo convierten en un bloque de código.
X Tian
Entonces, invoke-rc.d nginx rotateestá fallando, intente ejecutarlo como el usuario apropiado y muéstrenos ese script también, pegue el resultado en su pregunta original. tks.
X Tian
Intenté ejecutarlo, recibí un error de comando no válido.
Chris

Respuestas:

9

La acción de rotación posterior parece ser incorrecta

Tratar

invoke-rc.d nginx reload >/dev/null 2>&1

Si observa el nginxcomando, verá las acciones que aceptará. También el mensaje que recibió dice chequeinitctl --help

xtian@fujiu1404:~/tmp$ initctl help
Job commands:
  start                       Start job.
  stop                        Stop job.
  restart                     Restart job.
  reload                      Send HUP signal to job.
  status                      Query status of job.
  list                        List known jobs.

entonces la recarga debería funcionar y enviar la señal HUP a nginx para forzar la reapertura de los archivos de registro.

X Tian
fuente
Gracias, ese comando parece haberse ejecutado sin error. Actualizaré el trabajo cron e iremos desde allí.
Chris
Hay un error tipográfico (nginix), pero no puedo editarlo porque es un cambio de carácter único.
Koen
4

Como se mencionó en otra respuesta, el problema es que invoke-rc.d nginx rotatedevuelve un error que indica que la rotateacción no es compatible. Lo interesante es que service nginx rotatefunciona sin problemas.

Supongo que el invoke-rc.dcontenedor no admite todas las acciones que admite el script de inicio nginx real.

Cambiar invoke-rc.d nginx rotatea service nginx rotatedebería resolver el problema.

Robin Smidsrød
fuente
3

No estoy seguro de si es porque la initctldosis no es compatible con la rotateopción, y cuándo se eliminó, pero usted no es el único afectado por esto, y hay un informe de error abierto para esto en la plataforma de lanzamiento.

Como mencionan otras respuestas arriba y abajo, puede editar el archivo logrotate de nignx y reemplazar la línea problmatic

invoke-rc.d nginx reload >/dev/null 2>&1

con otras alternativas que funcionan,

start-stop-daemon --stop --signal USR1 --quiet --pidfile /run/nginx.pid --name nginx
# or 
service nginx rotate >/dev/null 2>&1
# or
[ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid`

Independientemente del método que elija, no cambie un archivo administrado por un paquete y, después de cambiarlo, ya no se actualizará y tendrá que resolver manualmente el diff o sobrescribirlo con un uno nuevo (que todo listo incluye la solución).

Rabin
fuente
No estoy seguro de que el error "los comandos de servicio no funcionan" se aplica aquí, ya que hay diferentes problemas abordados en cada error. (Dato curioso: tengo una solución en proceso para 1450770)
Thomas Ward
1

Trabajado para mí:
Sustituido
postrotate invoke-rc.d nginx rotate >/dev/null 2>&1
Con
postrotate service nginx rotate >/dev/null 2>&1

Jadeye
fuente
0

Reemplazar:

invoke-rc.d nginx reload >/dev/null 2>&1

Con:

[ ! -f /var/run/nginx.pid ] || kill -USR1 `cat /var/run/nginx.pid`

Parece que en las versiones más nuevas de Nginx esto funciona. Estoy ejecutando versiones 1.9.

bonitarunner
fuente