调度需要定期运行的脚本
1. cron 时间表
cron 时间表通过一种特别的格式指定作业何时运行,其格式如下:
minutepasthour hourofday dayofmonth month dayofweek command
cron 时间表允许使用特定值、取值范围(比如 1~5)或者通配符(星号)来指定各个字段。
如果想在每天的 10:15 运行一个命令,可以使用如下 cron 时间表字段:
15 10 * * * command
dayofmonth、month 以及 dayofweek 字段中的通配符表明,cron 会在每天 10:15 执行该命令。
要指定一条在每周一的下午 4:15(4:15 p.m.)执行的命令,可以使用军事时间(1:00 p.m.是 13:00,2:00 p.m.是 14:00,3:00 p.m.是 15:00,以此类推)
如下所示:
15 16 * * 1 command
可以使用三字符的文本值(mon、tue、wed、thu、fri、sat、sun)或数值(0 或 7 代表周日,6 代表周六)来指定 dayofweek 字段。
这里还有另外一个例子。要想在每月第一天的中午 12 点执行命令,可以使用下列字段:
00 12 1 * * command
命令列表必须指定要运行的命令或脚本的完整路径。你可以像在命令行中那样,添加所需的任何选项和重定向符:
15 10 * * * /home/christine/backup.sh > backup.out
cron 程序会以提交作业的用户身份运行该脚本,因此你必须有访问该脚本(或命令)以及输出文件的合理权限。
2. 构建 cron 时间表
每个用户(包括 root 用户)都可以使用自己的 cron 时间表运行已安排好的任务。Linux 提供了 crontab 命令来处理 cron 时间表。
要列出已有的 cron 时间表,可以用-l 选项:
$ crontab -l
no crontab for christine
$
在默认情况下,用户的 cron 时间表文件并不存在。可以使用-e 选项向 cron 时间表添加字段。
在添加字段时,crontab 命令会启动一个文本编辑器(参见第 10 章),使用已有的 cron 时间表
作为文件内容(如果时间表不存在,就是一个空文件)。
3. 浏览 cron 目录
如果创建的脚本对于执行时间的精确性要求不高,则用预配置的 cron 脚本目录会更方便。
预配置的基础目录共有 4 个:hourly、daily、monthly 和 weekly。
$ ls /etc/cron.*ly
/etc/cron.daily:
0anacron apt-compat cracklib-runtime logrotate [...]
apport bsdmainutils dpkg man-db [...]
/etc/cron.hourly:
/etc/cron.monthly:
0anacron
/etc/cron.weekly:
0anacron man-db update-notifier-common
$
4. anacron 程序
如果 anacron 判断出某个作业错过了设置的运行时间,它会尽快运行该作业。
这意味着如果Linux 系统关闭了几天,等到再次启动时,原计划在关机期间运行的作业会自动运行。
有了anacron,就能确保作业一定能运行,这正是通常使用 anacron 代替 cron 调度作业的原因
anacron 程序只处理位于 cron 目录的程序,比如/etc/cron.monthly。它通过时间戳来判断作业是否在正确的计划间隔内运行了。
每个 cron 目录都有一个时间戳文件,该文件位于/var/spool/anacron:
$ ls /var/spool/anacron
cron.daily cron.monthly cron.weekly
$
$ sudo cat /var/spool/anacron/cron.daily
[sudo] password for christine:
20200619
$
anacron 程序使用自己的时间表(通常位于/etc/anacrontab)来检查作业目录:
$ cat /etc/anacrontab
# /etc/anacrontab: configuration file for anacron
# See anacron(8) and anacrontab(5) for details.
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
HOME=/root
LOGNAME=root
# These replace cron's entries
1 5 cron.daily run-parts --report /etc/cron.daily
7 10 cron.weekly run-parts --report /etc/cron.weekly
@monthly 15 cron.monthly run-parts --report /etc/cron.monthly
$
anacron 时间表的基本格式和 cron 时间表略有不同:
period delay identifier command
period 字段定义了作业的运行频率(以天为单位)。anacron 程序用该字段检查作业的时间