crontab怪异

情况是这样的:天南要为一台服务器上的Nginx切分日志,用logrotate和crontab配合实现,但是并不是想像中的那么顺利。

为实现效果,天南是这样做的:
1、在 /etc/logrotate.d/ 下建立一个名为 nginx_ahyooan_com 的文件,内容如下:

/data/www/ahyooan.com/logs/access.log{
notifempty
daily
dateext
copytruncate
nocompress
rotate 30
sharedscripts
postrotate
/bin/kill -HUP `/bin/cat /usr/local/nginx/logs/nginx.pid`
endscript
}

2、执行logrotate:

# /usr/sbin/logrotate -vf /etc/logrotate.conf

没有报错,/data/www/ahyooan.com/logs/ 下也生成了转储文件,且nginx正常访问,一切正常。
由于Logrotate是基于CRON运行的,所以这个时间是由CRON控制的,默认情况下不能精确控制时间,所以想直接通过 crontab 来制定计划任务。

3、加入计划任务,每天0点时执行任务:

# vi /etc/crontab

添加以下内容:

0  0  *  *  * root      run-parts /etc/cron.daily   #执行所有日计划 
#0  0  *  *  * root      /usr/sbin/logrotate -f /etc/logrotate.d/nginx_ahyooan_com    #只执行切分任务
# 0 0  * * * root /usr/sbin/logrotate -f /etc/logrotate.conf
#以上三种任务定义方法,都试过了,从crontab日志来看,任务都是正常执行了,但是天南发现并没有达到预期效果(nginx日志没有切分)

4、重启crontab服务:

# service crond restart

结果不管天南怎么试,到达时间后,通过 #cat /var/log/cron 发现定义的任务是执行了的,如下图示:
crontab日志
可是Nginx并没有切分日志;而当我们将命令单独拿出来执行,如:

# /usr/sbin/logrotate -f /etc/logrotate.conf

执行之后发现Nginx日志成功切分了。好神奇~~,天南纳闷,这任务到底有没有成功执行呢?

后来同群里交流,都说我的crontab写错了,上面的写法是执行了一个名为root的程序,其实这种说法也是不对的。因为:/etc/crontab 中是需要定义此任务由哪个用户去执行的。

后来,换一种常规写法:

# crontab -e

## 然后INSERT添加下面一行定义(下面一行只供测试,每时每分执行)
* *  * * *  /usr/sbin/logrotate -f /etc/logrotate.conf
## 如果要每天零点执行,则定义为(每天零点执行):
0 0  * * *  /usr/sbin/logrotate -f /etc/logrotate.conf

## 保存之后测试发现Nginx日志成功切分

最后,通过:

#crontab -l

能看到当前用户(root)的计划任务,而之前通过直接编辑 /etc/crontab 文件的方式后执行此命令,没有输出。。。

为何?从crontab日志文件 /var/log/cron 来看,任务的确是执行了,而实际上并没有达到预期效果。以前直接编辑 /etc/crontab 文件执行PHP定时任务,是正常的啊,纠结。。

发布者:天南

一个好人

留下评论

电子邮件地址不会被公开。 必填项已用*标注