让我们一起深入了解一下 crontab,包括它的命令以及与之相关的各种操作技巧。
本文将指导你如何利用 cron 工具安排任务,并且还会介绍一些在线工具,帮助你格式化和测试 cron 命令。
起源
“crontab”是“cron table”的缩写。“cron”这个词来源于希腊语“Chronos”,意为时间。Crontab 是一个系统守护进程,能够按照预定的时间自动执行一系列任务和作业。
应用场景
Crontab 的应用非常广泛,例如:自动备份数据、轮换日志文件、在不同服务器之间同步文件以及清理临时文件夹等。虽然它可以用于任何类型的工作,但在系统管理领域尤其重要。
借助 cron,管理员可以精确地在特定的日期和时间运行作业。
接下来,我们将学习如何配置它。
crontab 语法
cron 工具通过读取配置文件来执行命令。为了解析 crontab 配置文件中的每一行,它遵循特定的语法规则。Crontab 的每一行由六个字段构成。前五个字段(1-5)定义了作业的执行时间和日期。第六个字段则是要执行的用户名和/或任务/作业/命令/脚本。
* * * * * USER_NAME 命令/脚本执行
│ │ │ │ │
│ │ │ │ │
│ │ │ │ |_________ 星期几(0-6,0 表示星期日,也可以使用名称)
│ │ │ |____________ 月份 (1-12),* 表示每个月
│ │ |______________ 日期 (1-31),* 表示每一天
│ |________________ 小时 (0-23),* 表示每小时
|___________________ 分钟 (0-59),* 表示每分钟
注意:
- 星号 *
- 表示匹配该字段的所有可能值。例如,小时字段中的星号表示每小时,月份字段中的星号表示每个月。
用户名是可选的(仅在系统 crontab 文件中可用)
示例:
为了更好地理解上述语法,我们来看一些例子:
0 5 * * * /scripts/job.sh
1. 设定一个 cron 任务,在每天早上 5 点执行。
0 6,18 * * * /scripts/job.sh
2. 设定一个 cron 任务,在每天早上 6 点和下午 6 点执行两次。
* * * * * /scripts/job.sh
3. 设定一个 cron 任务,每分钟执行一次。
0 19 * * mon /scripts/job.sh
4. 设定一个 cron 任务,在每周一晚上 7 点执行。
*/10 * * * * /scripts/job.sh
5. 设定一个 cron 任务,每 10 分钟执行一次。
* * * feb,jun,oct * /script/job.sh
6. 设定一个 cron 任务,在指定月份执行。
25 7 4 3 * /home/script/backup.sh
7. 在 3 月 4 日上午 7:25 运行 shell 脚本 /home/script/backup.sh
8. 设定一个 cron 任务,每 30 秒执行一次。
- 由于 crontab 不能直接控制秒数,我们可以通过以下两步实现:
* * * * * /home/scripts/script.sh
- 首先,设定一个每分钟运行的任务。
* * * * * sleep 30; /home/scripts/script.sh
然后使用 sleep 命令暂停执行 30 秒。
这样,上述任务会先暂停 30 秒,然后再继续执行。
Cron 配置文件的类型
Cron 配置文件主要分为两种:
UNIX/Linux 系统 Crontab
这种类型的 crontab 通常需要 root 权限才能使用,因为它主要用于系统服务和关键任务。在语法描述中,第六个字段是执行命令的用户名,这使得系统 crontab 能够以任意用户身份运行命令。
用户 crontab
用户可以使用 crontab 命令来管理自己的 cron 作业。 同样,第六个字段是要执行的命令,并且所有命令都以创建 crontab 的用户身份运行。 虽然每个用户的 crontab 文件位于 /var/spool/cron/crontabs 目录下,但并不建议直接编辑这些文件。 我们应该使用 crontab 命令来管理自己的 cron 作业。
它是如何运作的? cron 服务(守护进程)在后台运行,并持续(每分钟)检查 /etc/crontab 文件和 /etc/cron.*/ 目录,还会检查 /var/spool/cron/ 目录。 命令由执行 cron。
当分钟、小时和月份字段与当前时间匹配,并且至少有一个日期字段(月份中的某天或星期几)与当前日期匹配时,相应的命令会被执行。
基本命令
列出已有的 Cron 作业
crontab -l
我们可以使用以下命令列出所有的 Cron 作业,而无需打开 crontab 配置文件:
[[email protected] ~]# crontab -l no crontab for techblik.com [[email protected] ~]#
如果没有已存在的作业,将会返回以下信息:
[[email protected] ~]# crontab -l # Edit this file to introduce tasks to be run by cron. # # Each task to run has to be defined through a single line # indicating with different fields when the task will be run # and what command to run for the task # # To define the time you can provide concrete values for # minute (m), hour (h), day of month (dom), month (mon), # and day of week (dow) or use '*' in these fields (for 'any').# # Notice that tasks will be started based on the cron's system # daemon's notion of time and timezones. # # Output of the crontab jobs (including errors) is sent through # email to the user the crontab file belongs to (unless redirected). # # For example, you can run a backup of all your user accounts # at 5 a.m every week with: # 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/ # # For more information see the manual pages of crontab(5) and cron(8) # # m h dom mon dow command 0 */1 * * * /home/account/scripts/updateAccountStatuses.sh 0 */1 * * * /home/account/scripts/reActivateAccountStatus.sh [[email protected] ~]#
如果用户已经添加了一些作业,它将显示如下:
cron 表是特定于用户的,这意味着必须使用特定用户登录才能查看其 cron 表列表。
列出特定用户的 Cron 作业
要列出其他用户的计划作业,可以使用 `-u` (用户)和 `-l` (列表)选项。
crontab -u 其他用户名 -l
示例:crontab -u techblik.com -l
添加/修改 Crontab 条目
要编辑 crontab 条目,我们可以使用 `-e` 选项,如下所示。
crontab -e
上述命令将打开 vi 编辑器,你可以在其中编辑作业的详细信息并保存文件。保存后,你可以使用 `crontab -l` 来确认 cron 是否配置成功。
为特定用户添加/修改 Crontab 条目
crontab -u another_username -e
我们可以使用以下命令为另一个用户编辑 crontab:
示例:crontab -u techblik.com -e
删除 crontab 条目
可以使用 **-r** 参数来删除完整的计划作业,而无需进行确认。
crontab -r
crontab -i -r
[[email protected] ~]# crontab -i -r crontab: really delete techblik.com's crontab?
如果你想在删除计划作业之前进行确认,可以使用带 `-r` 的 **-i** 选项,这样会在删除用户的 crontab 之前提示用户确认。
crontab 特殊字符串
除了前面介绍的语法,crontab 还提供八个特殊字符串,不仅可以节省时间,还能提高可读性。
特殊字符串
描述
@reboot
系统启动后运行一次。
@yearly
每年运行一次,即 0 0 1 1 *
@annually
与 @yearly 相同。
@monthly
每月运行一次,即 0 0 1 * *
@weekly
每周运行一次,即 0 0 * * 0
@daily
每天运行一次,即 0 0 * * *
@midnight
与 @daily 相同。
@hourly
每小时运行一次,即 0 * * * *
Crontab 特殊字符串示例
1. 使用 crontab 每年安排任务:
@yearly /scripts/greeting.sh
可以使用上述命令在每年的第一分钟发送新年祝福。
2. 使用 crontab 安排每月执行的任务:
@monthly /scripts/cleanup.sh
可以使用上述命令在每个月初执行一些清理任务。
同样,其他 crontab 特殊字符串可以用于每周、每天和每小时的目的。
cron 目录
- 系统管理员可以使用预定义的 cron 目录来安排系统范围的 cron 作业,如下所示:
- /etc/cron.d
- /etc/cron.daily
- /etc/cron.hourly
- /etc/cron.monthly
/etc/cron.weekly
Crontab 真实示例
我们来讨论一些系统管理员或 IT 专业人员常用的真实示例。
删除空文件和目录
45 0 * * * techblik.com find /tmp -type f -empty -delete
上述 cron 表达式会从 /tmp 目录中查找空文件和目录,并将其删除。 该作业将在每天上午 12:45 运行。 需要指定用户名来执行这项工作。 在这个例子中,用户 techblik.com 正在执行 cron 作业操作。
使用单个 cron 执行多个任务
* * * * * /home/scripts/backup.sh; /home/scripts/scriptp.sh
多个任务/作业可以用分号 (;) 分隔,并且可以分配给单个 cron 表达式。
Cron 格式化和测试工具
到目前为止,我们已经讨论了 crontab 的命令和语法来安排任务。 然而,如果你不是系统管理员,或者你的工作不是经常设置 cron 任务,你可能很难记住语法,并且容易出错。 别担心,我们有办法解决这个问题。
网上有很多 cron 格式化工具。
# 1. Cron 作业生成器 Cron 作业生成器
提供了一个用户友好的图形界面,你可以在其中指定脚本的分钟数、日期和路径,然后生成 crontab 代码。
让我们看一个实际的例子,假设我们需要在周一到周五每 5 分钟执行一次 /home/processMonitor.sh。
那么,我们得到的 crontab 代码如下,可以通过执行 `crontab -e` 将其添加到你的 crontab 中:
0,5,10,15,20,25,30,35,40,45,50,55 * * * 1-5 /home/processMonitor.sh
# 2. Easycron Easycron
是一个实用的基于 Web 的 cron 作业调度器。 通过指定要调用的 URL 并设置其执行时间,可以创建一个 cron 作业。 也可以选择手动添加 cron 表达式,或者以描述性形式添加。 此外,为了提高安全性,还可以选择使用基本的 HTTP 身份验证。
不仅如此,Easycron 还可以用于实现标准 cron 表达式、cron 作业执行日志、电子邮件通知、单独的失败日志等其他用途。
# 3. crontab 生成器 crontab 生成器
是另一个方便的 crontab 生成工具,通过该工具,你可以选择是否将 cron 输出保存到文件或发送到电子邮件。
# 4. Crontab 大师 Crontab 大师
是一个简单的在线 cron 调度表达式编辑器。 此外,它还提供了一种有用的方法来监视你的 cron 作业。 你需要做的就是复制提供的命令并将其附加到 crontab 定义的末尾。 如果 cron 作业失败,或者甚至没有启动,你将收到一封警报电子邮件。
在下面的例子中,作业将在每天、每月和每周的 04:05 执行。
# 5. CRON 测试仪 CRON 测试仪
允许我们测试 cron 时间/日期定义。 在某些情况下,我们可能需要解码现有的 cron 语法以进行故障排除或者只是想进行测试。
为此,我们可以使用这个工具。 我们需要做的就是将 cron 表达式复制并粘贴到 cron 定义字段中,然后选择迭代次数并单击“测试”以查看它将在哪些日期运行。
让我们检查一下 cron 表达式 `4 3 */2 * *`,它应该每两天在 03:04 (AM) 运行一次。 让我们使用 cron tester 来验证一下。
结论 希望以上内容可以帮助你更好地理解 crontab 并设置 cron 作业。 通过 cron 调度作业是 Linux 管理员执行的众多任务之一。 如果你有兴趣学习更高级的技能,请查看此课程
.