d.ansimov
d.ansimov

Reputation: 2171

I'm stuck on logrotate mystery

I have two logrotate files:

/etc/logrotate.d/nginx-size

/var/log/nginx/*.log 
/var/log/www/nginx/50x.log

{
    missingok
    rotate 3
    size 2G
    dateext
    compress
    compresscmd /usr/bin/bzip2
    compressoptions -6
    compressext .bz2
    uncompresscmd /usr/bin/bunzip2
    notifempty
    create 640 nginx nginx
    sharedscripts
    postrotate
        [ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid`
    endscript
}

and

/etc/logrotate.d/nginx-daily

/var/log/nginx/*.log 
/var/log/www/nginx/50x.log

{
    missingok
    rotate 3
    dateext
    compress
    compresscmd /usr/bin/bzip2
    compressoptions -6
    compressext .bz2
    uncompresscmd /usr/bin/bunzip2
    notifempty
    create 640 nginx nginx
    sharedscripts
    postrotate
        [ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid`
    endscript
}

Command logrotate -d -v /etc/logrotate.d/nginx-sizeoutput:

reading config file /etc/logrotate.d/nginx-size
compress_prog is now /usr/bin/bzip2
compress_options is now  -6
compress_ext is now .bz2
uncompress_prog is now /usr/bin/bunzip2

Handling 1 logs

rotating pattern: /var/log/nginx/*.log 
/var/log/www/nginx/50x.log

 2147483648 bytes (3 rotations)
empty log files are not rotated, old logs are removed
considering log /var/log/nginx/access.log
  log does not need rotating
considering log /var/log/nginx/error.log
  log does not need rotating
considering log /var/log/nginx/get.access.log
  log does not need rotating
considering log /var/log/nginx/post.access.log
  log needs rotating
considering log /var/log/www/nginx/50x.log
  log does not need rotating
rotating log /var/log/nginx/post.access.log, log->rotateCount is 3
dateext suffix '-20141204'
glob pattern '-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
glob finding old rotated logs failed
renaming /var/log/nginx/post.access.log to /var/log/nginx/post.access.log-20141204
creating new /var/log/nginx/post.access.log mode = 0640 uid = 497 gid = 497
running postrotate script
running script with arg /var/log/nginx/*.log 
/var/log/www/nginx/50x.log

: "
        [ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid`
"
compressing log with: /usr/bin/bzip2

Same (normal) output on ngnix-daily..

If I run from root command

logrotate -f /etc/logrotate.d/nginx-size 

manually, it do all the thing. BUT! It don't run it automatically!

contab:

*/5 5-23 * * * root logrotate -f -v /etc/logrotate.d/nginx-size 2>&1 > /tmp/logrotate_size   
00 04 * * * root logrotate -f -v /etc/logrotate.d/nginx-daily 2>&1 > /tmp/logrotate_daily

Also, files /tmp/logrotate_daily & /tmp/logrotate_size are always empty..

Cron don't give me any errors in /var/log/cron

Dec  4 14:45:01 (root) CMD (logrotate -f -v /etc/logrotate.d/nginx-rz-size 2>&1 > /tmp/logrotate_size   )
Dec  4 14:50:01 (root) CMD (logrotate -f -v /etc/logrotate.d/nginx-rz-size 2>&1 > /tmp/logrotate_size   )

What's wrong with dat thing?.. Centos 6.5 x86_64, Logrotate version 3.8.7 (out of source) + logrotate version 3.7.8 (via rpm).

Thx in advance.

Upvotes: 3

Views: 3183

Answers (1)

Etan Reisner
Etan Reisner

Reputation: 80931

Your redirections are incorrect in those cron lines. They will not output error information to those files.

Redirection order matters. You want >/tmp/logrotate_size 2>&1 to get what you want.

The underlying issue here is one of the things covered by the "Debugging crontab" section of the info page.

Namely "Making assumptions about the environment".

Making assumptions about the environment

Graphical programs (X11 apps), java programs, ssh and sudo are notoriously problematic to run as cron jobs. This is because they rely on things from interactive environments that may not be present in cron's environment.

To more closely model cron's environment interactively, run

env -i sh -c 'yourcommand'

This will clear all environment variables and run sh which may be more meager in features that your current shell.

Common problems uncovered this way:

foo: Command not found or just foo: not found.

Most likely $PATH is set in your .bashrc or similar interactive init file. Try specifying all commands by full path (or put source ~/.bashrc at the start of the script you're trying to run).

Upvotes: 3

Related Questions