调度作业
普通用户可以使用 crontab 命令来管理他们的作业。
可以通过四种不同的方式调用此命令:
Command | 作用 |
---|---|
crontab -l | 列出当前用户的作业 |
crontab -r | 删除当前用户的所有作业。 |
crontab -e | 编辑当前用户的作业。 |
crontab [filename] | 删除所有作业,并替换为从 [filename] 读取的作业。如果未指定文件,则将使用标准输入。 |
如何编辑和查看 crontab
使用“crontab -e”编辑作业时,将启动编辑器(默认情况下为 vi。
除非 EDITOR 环境变量已设置为不同的内容)。
正在编辑的文件每行将有一个作业。
允许空行,注释以井号 (#) 开始。
# crontab -e
不带任何选项执行命令“crontab -e”时,默认编辑当前登录用户的crontab。
要编辑另一个用户的 crontab,我们可以在 crontab 命令中使用 -u 选项。
比如编辑用户john的crontab。
# crontab -u john -e
同样,要查看当前用户的crontab,使用“crontab -l”命令。
# crontab -l
要列出特定用户的 crontab,请使用以下命令。
# crontab -u john -l
处理输出
脚本通常会在屏幕上打印一些内容,用于调试、状态更新或者记录错误。
作业打印到屏幕上的任何内容都会通过电子邮件发送给当前用户,这可以用 crontab 中的 MAILTO 变量覆盖。
# crontab -l MAIL=john 0 2 * * * /apps/bin/backup.sh
cron 作业示例
1. 每年 2 月 2 日安排工作
我们需要在每年 2 月的特定日期运行一次备份脚本。
语法如下所示。
0 9 2 2 * /usr/local/bin/yearly_backup
2. 每天在第 5 分钟每小时安排一次工作
使用以下命令在每天的第 5 分钟每小时运行一个脚本:
5 * * * * $HOME/bin/daily.job >> $HOME/tmp/out 2>&1
3. 每天午夜后 5 分钟安排工作
每天午夜后使用以下命令运行 5 分钟:
5 0 * * * $HOME/bin/daily.job >> $HOME/tmp/out 2>&1
4. 在每个月的第一天的特定时间安排工作
使用以下命令在 2.15 P.M. 运行每个月的第一天:
15 14 1 * * * $HOME/bin/monthly
5. 仅在工作日(周六和周日除外)的特定时间安排工作
使用以下命令在晚上 10 点运行在工作日:
0 22 * * 1-5 $HOME/bin/weekday.job >> $HOME/tmp/out 2>&1
6. 在单个 cron 作业中调度多个作业
我们还可以使用分号 (;) 分隔的作业在单个 cron 作业中安排多个作业,如下所示:
0 12 * * * /var/tmp/script01.sh; /var/tmp/script02.sh
7. 使用范围来指定开始时间
可以通过使用连字符来指定范围。
值 1-5 表示此字段对数字 1 到 5 有效。
如果使用名称而不是数字,则不能指定范围。
指定范围的示例如下所示。
作业计划从下午 3 点开始每小时运行一次。
到晚上 10 点
* 3-10 * * * /var/tmp/script.sh
8. 使用步长值指定开始时间
步长值可以与范围结合使用。
要指定步长值,请在范围后跟一个正斜杠 (/) 和一个数字。
指定的数字是步长值。
例如,以下指定应匹配每三个值(在本例中为 2、5、8 和 11):
* 0-12/3 * * * /var/tmp/script.sh
步长值也可以与星号一起使用。
小时字段中的值 */3 将每三个小时匹配一次(0、3、6、9、12、15、18 和 21)。
9. 使用列表指定开始时间
列表也是可以接受的;列表中的每一项都用逗号分隔。
通常将列表与范围结合使用,如下所示:
1-15,31-45 * * * * /var/tmp/script.sh
此示例匹配从 1 到 15 以及从 31 到 45 的所有数字(在我们的示例中为分钟)。
如果我们使用名称而不是数字,则无法指定列表。
10. 安排每个月 1 号、10 号和 22 号凌晨 4:45 的工作
下面显示的是在一个月的几个特定日期的特定时间运行作业的示例。
45 4 1,10,22 * * /apps/bin/backup.sh
GNU/Linux 系统支持多个用于调度任务的实用程序。
cron 实用程序得到了最广泛的支持。
它允许我们安排任务定期在后台运行。
cron 实用程序使用一个表 (crontab),其中包含要执行的脚本或者命令以及执行时间的列表。
Crontab 宏
我们可以在 crontab 文件中添加宏。
例如,在每次重新启动后使用以下命令重新启动“my_script”:
@reboot /var/tmp/my_script
以下是另外几个宏的总结:
Entry | 说明 | 相当于 |
---|---|---|
@reboot | 启动时运行一次 | None |
@weekly | 每周运行一次 | 0 0 * * 0 |
@daily | 每天运行一次 | 0 0 * * * |
@midnight | (与@daily 相同) | 0 0 * * * |
@hourly | 每小时运行一次 | 0 * * * * |
定时配置文件
cron 后台进程大多处于空闲状态。
它每分钟唤醒一次并检查 /etc/crontab、/etc/cron.d 和用户 cron 表文件,并确定是否有任何需要执行的作业。
下表总结了 cron 使用的各种文件和目录的用途。
了解这些文件和目录将解决任何问题并更详细地了解 cron。
File | 作用 |
---|---|
/etc/init.d/crond | 在系统启动时启动 cron 守护进程。 |
/var/log/cron | 与 cron 进程相关的系统消息。用于故障排除问题。 |
/var/spool/cron/[username] | 用户 crontab 文件存储在 /var/spool/cron 目录中。 |
/etc/cron.allow | 指定可以创建 cron 表的用户。 |
/etc/cron.deny | 指定不允许创建 cron 表的用户。 |
/etc/crontab | 具有用于运行位于以下目录中的脚本的命令的系统 cron 表:/etc/cron.hourly、/etc/cron.daily、/etc/cron.weekly 和 /etc/cron.monthly。 |
/etc/cron.d | 一个目录,其中包含需要按每小时、每天、每周或者每月以外的时间表运行的作业的 cron 表。 |
/etc/cron.hourly | 包含每小时运行的系统脚本的目录。 |
/etc/cron.daily | 包含每天运行的系统脚本的目录。 |
/etc/cron.weekly | 包含每周运行的系统脚本的目录。 |
/etc/cron.monthly | 包含每月运行的系统脚本的目录。 |
Crontab 语法
单个用户的作业存储在目录 /var/spool/cron 中与用户名匹配的文件中。
这些文件始终属于用户 root。
/var/spool/cron 中的文件不是直接编辑的。
相反,使用名为 crontab 的程序来操作它们。
下图显示了 cron 作业的语法。
文件中的每一行定义一个作业。
一行中有 6 个字段。
前 5 个字段定义时间,最后一个字段包含要运行的命令。
这可以是任何类型的命令或者 shell 脚本。
前 5 个字段具有以下格式:
字段 | 范围 |
---|---|
Minutes | 0-59 |
Hours | 0-23 |
Day of the Month | 1-31 |
Month | 0-12 |
Weekday | 0-7 |