擦发现有人直接偷文章,加个本文链接: http://www.jianshu.com/p/23b49d149426
1. 前言
最近在看logrotate
使用,现将一些问题和分析过程记录下.
内核版本和系统信息如下:
Linux xxx 4.10.0-37-generic #41~16.04.1-Ubuntu SMP Fri Oct 6 22:42:59 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
不同版本的不同软件配置信息可能会有差异
2. 基本使用
logrotate
基本的使用的流程如下:
创建一个
logrotate配置文件
将文件放到
/etc/logrotate.d
目录下
拿一个官方文档的示例,具体配置不在这里展开,如下:
# sample logrotate configuration filecompress /var/log/messages { rotate 5 weekly postrotate /usr/bin/killall -HUP syslogd endscript }
3. 问题
为什么只要将
logrotate
配置文件放在logrotate.d下面就会自动执行?具体什么时候执行呢?
4. 分析
既然跟logrotate
命令有关,那就使用man logrotate
查看下详情:
1 LOGROTATE(8) System Administrator's Manual LOGROTATE(8) 2 3 NAME 4 logrotate ‐ rotates, compresses, and mails system logs 5 6 SYNOPSIS 7 logrotate [-dv] [-f|--force] [-s|--state file] config_file .. 8 9 DESCRIPTION 10 logrotate is designed to ease administration of systems that generate large numbers of log files. 11 It allows automatic rotation, compression, removal, and mailing of log files. Each log file may be 12 handled daily, weekly, monthly, or when it grows too large. 13 14 Normally, logrotate is run as a daily cron job. It will not modify a log more than once in one day 15 unless the criterion for that log is based on the log's size and logrotate is being run more than 16 once each day, or unless the -f or --force option is used.
可以看到第14行中的: Normally, logrotate is run as a daily cron job
,表示logrotate
一般是以一个cron job
的形式每天执行,而cron
的每天任务是放在/etc/cron.daily
目录下的,查看该目录:
kk:~$ ll /etc/cron.daily total 68drwxr-xr-x 2 root root 4096 10月 10 22:48 ./ drwxr-xr-x 138 root root 12288 10月 25 20:20 ../ -rwxr-xr-x 1 root root 311 12月 29 2014 0anacron* -rwxr-xr-x 1 root root 372 5月 6 2015 logrotate*
发现该目录下有个logrotate
文件,里面内容如下:
1 #!/bin/sh2 3 # Clean non existent log file entries from status file4 cd /var/lib/logrotate 5 test -e status || touch status 6 head -1 status > status.clean 7 sed 's/"//g' status | while read logfile date 8 do9 [ -e "$logfile" ] && echo "\"$logfile\" $date"10 done >> status.clean 11 mv status.clean status 12 13 test -x /usr/sbin/logrotate || exit 0 14 /usr/sbin/logrotate /etc/logrotate.conf
重点在14行: /usr/sbin/logrotate /etc/logrotate.conf
. 打开/etc/logrotate.conf
:
1 # see "man logrotate" for details-----------------------------------------------------------skip----------------------------------------------------------------18 # packages drop log rotation information into this directory19 include /etc/logrotate.d -----------------------------------------------------------skip----------------------------------------------------------------
在第19行看到:include /etc/logrotate.d
. 根据include
指令的定义,该指令后面所跟的路径的文件会被按顺序读取(除了路径和特殊文件),这样可以解释问题1了.
但是还不完整,现在要找的是这个cron.daily
下面的文件什么在哪里被使用到. 使用man cron
查看说明:
1 CRON(8) System Manager's Manual CRON(8) -----------------------------------------------------------skip---------------------------------------------------------------- 35 NOTES 36 cron searches its spool area (/var/spool/cron/crontabs) for crontab files (which are named after accounts in 37 /etc/passwd); crontabs found are loaded into memory. Note that crontabs in this directory should not be 38 accessed directly - the crontab command should be used to access and update them. 39 40 cron also reads /etc/crontab, which is in a slightly different format (see crontab(5)). In Debian, the con‐ 41 tent of /etc/crontab is predefined to run programs under /etc/cron.hourly, /etc/cron.daily, /etc/cron.weekly 42 and /etc/cron.monthly. This configuration is specific to Debian, see the note under DEBIAN SPECIFIC below. 43 44 Like /etc/crontab, the files in the /etc/cron.d directory are monitored for changes. In general, the system administrator should not use /etc/cron.d/, but use the standard system 45 crontab /etc/crontab. 100 DEBIAN SPECIFIC -----------------------------------------------------------skip----------------------------------------------------------------- 124 Support for /etc/cron.hourly, /etc/cron.daily, /etc/cron.weekly and /etc/cron.monthly is provided in Debian 125 through the default setting of the /etc/crontab file (see the system-wide example in crontab(5)). The default 126 system-wide crontab contains four tasks: run every hour, every day, every week and every month. Each of these 127 tasks will execute run-parts providing each one of the directories as an argument. These tasks are disabled if 128 anacron is installed (except for the hourly task) to prevent conflicts between both daemons.
可以看到第40到45行说cron
默认会读取/etc/crontab
和/etc/cron.d
下面的文件(mark一下,下文有用到),先看下/etc/crontab
:
# /etc/crontab: system-wide crontab# Unlike any other crontab you don't have to run the `crontab'# command to install the new version when you edit this file# and files in /etc/cron.d. These files also have username fields,# that none of the other crontabs do.SHELL=/bin/shPATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin# m h dom mon dow user command17 * * * * root cd / && run-parts --report /etc/cron.hourly25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
发现有执行cron.daily
,在每天的6:25
.但是由于本机是ubuntu
,属于DEBIAN
分支,看下DEBIAN SPECIFIC
,发现第127到128行又说These tasks are disabled if anacron is installed(except for the hourly task)
,查看下:
kk:~$ dpkg -l | grep anacron ii anacron 2.3-23 amd64 cron-like program that doesn't go by time
既然anacron
有安装,那/etc/crontab
的cron.daily
就要被disable
了,那只能看anacron
了,使用man anacron
:
1 ANACRON(8) Anacron Users' Manual ANACRON(8) 2 -----------------------------------------------------------skip---------------------------------------------------------------- 15 16 When executed, Anacron reads a list of jobs from a configuration file, normally /etc/anacrontab (see anacrontab(5)). This file contains the list of jobs that Anacron controls. 17 Each job entry specifies a period in days, a delay in minutes, a unique job identifier, and a shell command.
从第16行中可以看到anacron
的默认配置文件为/etc/anacrontab
,看下:
1 # /etc/anacrontab: configuration file for anacron2 3 # See anacron(8) and anacrontab(5) for details.4 5 SHELL=/bin/sh 6 PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin 7 HOME=/root 8 LOGNAME=root 9 10 # These replace cron's entries11 1 5 cron.daily run-parts --report /etc/cron.daily 12 7 10 cron.weekly run-parts --report /etc/cron.weekly 13 @monthly 15 cron.monthly run-parts --report /etc/cron.monthly
第11行中的1表示一天执行一次,5表示延迟5分钟
终于在第11行看到cron.daily
了,那anacron
又是何时执行呢?上文在讲cron
默认读取的文件时,除了/etc/crontab
之外,还会读取/etc/cron.d/
下的文件,将该目录列出:
keith@keith-desktop:/etc$ ll /etc/cron.d total 28drwxr-xr-x 2 root root 4096 2月 16 2017 ./ drwxr-xr-x 138 root root 12288 10月 25 20:20 ../ -rw-r--r-- 1 root root 244 12月 29 2014 anacron
发现有个anacron
文件,查看下:
# /etc/cron.d/anacron: crontab entries for the anacron packageSHELL=/bin/sh PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin 30 7 * * * root test -x /etc/init.d/anacron && /usr/sbin/invoke-rc.d anacron start >/dev/null
可以看到anacron
的执行时间为每天的7:30
分,这当然是不关机的情况,但如果超过这个点才开机呢?看下开机启动项有没有:
kk:~$ ll /etc/init.d | grep anacron -rwxr-xr-x 1 root root 2014 12月 29 2014 anacron*
果然有,那就说明它有两种启动方式,一种是开机自启,一种是/etc/cron.d/anacron
中编排的. 但是现在又有一个问题,既然都开机自启了,再在cron
中编排时间有什么意义呢?打开看下:
1 #! /bin/sh2 ### BEGIN INIT INFO3 # Provides: anacron4 # Required-Start: $remote_fs $syslog $time5 # Required-Stop: $remote_fs $syslog $time6 # Default-Start: 2 3 4 57 # Default-Stop:8 # Short-Description: Run anacron jobs9 # Description: The first purpose of this script is to run anacron at10 # boot so that it can catch up with missed jobs. Note11 # that anacron is not a daemon. It is run here just once12 # and is later started by the real cron. The second13 # purpose of this script is that said cron job invokes14 # this script to start anacron at those subsequent times,15 # to keep the logic in one place.16 ### END INIT INFO17 18 PATH=/bin:/usr/bin:/sbin:/usr/sbin19 20 test -x /usr/sbin/anacron || exit 021 test -r /etc/default/anacron && . /etc/default/anacron -----------------------------------------------------------skip----------------------------------------------------------------
上面说anacron
不是一个后台进程,开机自启的目的是为了把遗漏的任务给补上,运行完任务后就退出了,在本次开机后的下一次执行任务就要由cron
来编排了,这么说就清楚了. 那么logrotate
配置文件的执行时间就是开机时间+延时时间
或者7:30
加延时时间.
流程总结如下:
logrotate配置文件执行流程 (1).png
是否安装anacron
的检查由cron
来执行默认
anacron
有安装就有设置开机自启
5. 总结
最后回答刚开始提出的问题
为什么只要将
logrotate配置文件
放在logrotate.d
下面就会自动执行? 这个可以上述分析和流程图.具体什么时候执行呢? 如果
anacron
有安装,则在刚开机时如果条件满足则是开机时间+延时时间
,如果是已经开机后条件满足则是/etc/cron.d/anacron中编排的时间+延时时间
;如果没有安装,则时间为/etc/crontab
中编排的时间.
注:
以上的分析是跟操作系统有关系的
anacrontab
中的还有会影响执行时间的因素如:RANDOM_DELAY
等,这里不深究了.
真是刚开始只是一些小小的问题, 如果要深究的话真的会发现一串一串的新东西跑出来. 擦码到现在发现都凌晨了,我还计划最迟9点能搞定然后...never mind.
作者:keith666
链接:https://www.jianshu.com/p/23b49d149426