使用的限制数据有:
/etc/cron.allow:
将可以使用 crontab 的账号写入其中,若不在这个文件中的使用者则不能使用 crontab;
/etc/cron.deny:
将不可以使用 crontab 的账号写入其中,若未记录到这个文件当中的使用者,就可以使用 crontab。
/etc/cron.allow 的优先级比 /etc/cron.deny 高!一般来说,两者保留一个即可。
当用户使用 crontab 这个指令来建立工作安排后,该项工作就会被记录到 /var/spool/cron/ 里边去,而且是以账号来作为判别的!
crontab 的语法:
[root@li ~]# crontab [-u 账号] [-l|-e|-r]
选项与参数:
-u:只有 root 才能使用的参数,帮助其他使用者建立/移除 crontab 工作
-e:编辑 crontab 的工作内容
-l:查阅 crontab 的工作内容
-r:移除所有的 crontab 的工作内容,若仅要移除一项,请用 -e 编辑
#用 li 的身份在每天的 12:00 发邮件给自己
[li@li ~]$ crontab -e
0 12 * * * mail -s "at 12:00" li < /home/li/.bashrc
上面编辑内容的六个字段分别表示的是:
代表意义 | 分钟 | 小时 | 日期 | 月份 | 周 | 指令 |
---|---|---|---|---|---|---|
数字范围 | 0-59 | 0-23 | 1-31 | 1-12 | 0-7 | 指令 |
比较有趣的是那个 “周”,0 和 7都代表星期天。另外,还有一些辅助的字符:
特殊字符 | 说明 |
---|---|
* | 代表任何时刻都接受! |
, | 代表分隔时段的意思 |
- | 代表一段时间 |
/n | n 是数字,代表每隔一段时间 |
这个 “crontab -e” 是针对使用者的 cron 来设计的,如果是 “系统的例行性工作” 时,该怎么办呢?是否还是需要以 “crontab -e” 来管理呢?当然不行了,你只要编辑 /etc/crontab 这个文件就可以了。有一点需要注意的是,crontab -e 这个 crontab 其实是 /usr/bin/crontab 这个执行文件,但是 /etc/crontab 可是一个存文本文件。
[root@li ~]# cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root #若有额外的 STDOUT,以 email 将数据发给谁
# For details see man 4 crontabs
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
一般来说,crond 预设有三个地方会有执行脚本配置文件:
在这三个地方中,跟系统的运作比较有关系的是 /etc/crontab 文件以及 /etc/cron.d/* 目录内的文件,另一个是跟用户自己的工作比较有关系的配置文件,就放在 /var/spool/cron/ 里边。现在来看看 /etc/cron.d 里边的文件:
[root@li cron.d]# ll /etc/cron.d
总用量 4
-rw-r--r--. 1 root root 128 8月 9 2019 0hourly
[root@li cron.d]# ls /etc/cron.*
/etc/cron.deny
/etc/cron.d:
0hourly
/etc/cron.daily:
logrotate man-db.cron
/etc/cron.hourly:
0anacron
/etc/cron.monthly:
/etc/cron.weekly:
[root@li cron.d]# cat /etc/cron.d/0hourly
# Run the hourly jobs
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
01 * * * * root run-parts /etc/cron.hourly
请注意最后一行,每个整点的一分会执行 run-parts /etc/cron.hourly 这个指令。那什么是 run-parts 呢?如果你有去分析一下这个执行文件,会发现它是一个 shell script,run-parts 脚本会在大约 5 分钟内随机选一个时间来执行 /etc/cron.hourly 目录内的所有执行文件!因此,放在 /etc/cron.hourly/ 的文件,必须是能被直接执行的指令脚本。
在 /etc 底下还有 cron.daily/、/etc/cron.monthly、/etc/cron.weekly,这三个文件与 /etc/cron.hourly 所不同的是,这三个目录是由 anacron 所执行的,而 anacron 的执行方式则是放在 /etc/cron.hourly/0anacron 里面的。
总结如下:
anacron 并不是用来取代 crontab 的,anacron 存在的目的是处理非 24 小时一直启动的 Linux 系统的 crontab 的执行!以及因为某些原因导致的超过时间而没有被执行的例行工作。
anacron 其实是一支程序而非一个服务。
[root@li cron.d]# cat /etc/cron.hourly/0anacron
#!/bin/sh
# Check whether 0anacron was run today already
if test -r /var/spool/anacron/cron.daily; then
day=`cat /var/spool/anacron/cron.daily`
fi
if [ `date +%Y%m%d` = "$day" ]; then
exit 0;
fi
# Do not run jobs when on battery power
if test -x /usr/bin/on_ac_power; then
/usr/bin/on_ac_power >/dev/null 2>&1
if test $? -eq 1; then
exit 0
fi
fi
/usr/sbin/anacron -s
anacron 的基本语法:
[root@li cron.d]# anacron [-sfn] [job]...
[root@li cron.d]# anacron -u [job]...
选项与参数:
-s:开始一连续的执行各项工作(job),会依据时间记录文件的数据判断是否进行
-f:强制进行,而不去判断时间记录文件的时间戳
-n:立刻进行未进行的任务,而不延迟等待时间
-u:仅更新时间记录文件的时间戳,不进行任何工作
job:由 /etc/anacrontab 定义的各项工作
anacron 的配置文件:
[root@li cron.d]# cat /etc/anacrontab
# /etc/anacrontab: configuration file for anacron
# See anacron(8) and anacrontab(5) for details.
SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# the maximal random delay added to the base delay of the jobs
RANDOM_DELAY=45 #随机给予最大延迟时间,单位是分钟
# the jobs will be started during the following hours only
START_HOURS_RANGE=3-22 #延迟多少个小时内应该要执行的任务时间
#period in days delay in minutes job-identifier command
1 5 cron.daily nice run-parts /etc/cron.daily
7 25 cron.weekly nice run-parts /etc/cron.weekly
@monthly 45 cron.monthly nice run-parts /etc/cron.monthly
[root@li cron.d]# more /var/spool/anacron/* #时间戳文件
::::::::::::::
/var/spool/anacron/cron.daily
::::::::::::::
::::::::::::::
/var/spool/anacron/cron.monthly
::::::::::::::
::::::::::::::
/var/spool/anacron/cron.weekly
::::::::::::::
我们拿 /etc/cron.daily 那一行的设定来说明。那四个字段的意思:
根据上面的配位文件内容,我们大概知道 anacron 的执行流程应该是这样的:
最后,我们总结一下:
也就是说,如果你每个周日的需要执行的动作是放置在 /etc/crontab 的话,那么该动作只要过期了就过期了,并不会被抓回来重新执行。但是如果是放置在 /etc/cron.weekly 目录下,那么该工作就会定期,几乎一定会在一周内执行一次。如果你关机超过一周,那么一开机后的数个小时内,该工作就会主动的被执行!