Linux 中的 Crontab – 带有实时示例和工具
已发表: 2015-07-26让我们探索一下 crontab、它的命令以及与 Crontab 相关的各种操作。
我们将学习如何使用 cron 实用程序安排任务,最后,我们还将讨论一些帮助我们格式化和测试 cron 命令的在线工具。
起源
crontab 代表“ cron 表”。 cron 这个词取自希腊词Chronos ,意思是时间。 Crontab 是一个系统守护进程,它会按照预定的时间自动执行一些任务和作业。
用例
Crontab 可用于执行各种操作,例如处理自动备份、轮换日志文件、在远程机器之间同步文件以及清除临时文件夹等。Crontab 可用于任何类型的工作,但当我们开始处理系统管理类工作。
使用 cron,管理员可以安排作业在特定时间和日期运行。
那么让我们看看如何设置它。
crontab 语法
要执行命令列表,cron 实用程序会读取配置文件。 为了解释crontab配置表中的行,它遵循 Crontab 语法。 Crontab 有六个字段,前五(1-5)个字段定义了执行的日期和时间。 最后一个字段,即第 6 个字段,可以是要执行的用户名和/或任务/job/command/script。
* * * * * USER_NAME 命令/脚本执行
│ │ │ │ │
│ │ │ │ │
│ │ │ │ |_________星期几(0 - 6)(0 是星期日,或使用名称)
│ │ │ | ____________月 (1 – 12),* 表示每个月
│ │ | ______________月份中的某一天 (1 – 31),* 表示每一天
│ | ________________小时 (0 – 23),* 表示每小时
| ___________________分钟 (0 – 59),* 表示每分钟
备注:
- 星号 (*) 用于匹配字段的所有可能值。 例如,小时字段中使用的星号相当于每小时,或者月份字段中的星号相当于每个月。
- 用户名是可选的(仅当它是系统 crontab 文件时才可用)
例子:
让我们通过一些例子来理解上面的语法
1. 安排一个 cron 在每天早上 5 点执行
0 5 * * * /scripts/job.sh2. 安排一个 cron 在每天早上 6 点和下午 6 点执行两次
0 6,18 * * * /scripts/job.sh3. 安排一个 cron 每分钟执行一次
* * * * * /scripts/job.sh4. 安排一个 cron 在每周一晚上 7 点执行。
0 19 * * mon /scripts/job.sh5. 安排一个 cron 每 15 分钟执行一次。
*/10 * * * * /scripts/job.sh6. 安排一个 cron 在选定的月份执行
* * * feb,jun,oct * /script/job.sh 7. 在 3 月 4 日上午 7:25 运行 shell 脚本/home/script/backup.sh
25 7 4 3 * /home/script/backup.sh8. 安排一个 cron 每 30 秒执行一次
由于我们无法控制 Crontab 中的秒数,但我们可以通过以下两步过程来实现。
- 让我们首先安排一个每分钟运行的任务。
* * * * * /home/scripts/script.sh- 现在让我们使用
sleep命令暂停执行 30 秒。
* * * * * sleep 30; /home/scripts/script.sh上述任务将停止执行 30 秒,然后再次恢复。
Cron 配置文件的类型
有两种类型的 Cron 配置文件:
UNIX/Linux 系统 Crontab
这需要 root 权限,因为它通常用于系统服务和关键作业。 第六个字段(在上述语法描述中)是运行命令的用户名。 它使系统 crontab 能够以任何用户身份运行命令。
用户 crontab
用户还可以使用 crontab 命令安装自己的 cron 作业。 同样,第六个字段(在上述语法描述中)是要运行的命令,所有命令都以创建 crontab 的用户身份运行。 每个用户都可以有自己的 crontab 文件,虽然这些是/var/spool/cron/ crontabs 中的文件,但不能直接编辑它们。 我们需要使用 crontab 命令来编辑或设置我们自己的 cron 作业。
它是如何工作的?
cron 服务(守护进程)在后台运行并不断检查(每分钟) /etc/crontab文件和/etc/cron.*/目录。 它还检查/var/spool/cron/目录。 当分钟、小时和月份字段与当前时间匹配时,命令由cron执行,并且至少有一个两天字段(月份中的某天,或星期几)与当前日期匹配。
基本命令
列出现有的 Cron 作业
我们可以使用以下命令列出所有 Cron 作业,而无需打开 crontab 配置文件
crontab -l如果没有现有作业,它将返回输出为
[geekflare@localhost ~]# crontab -l no crontab for geekflare [geekflare@localhost ~]#如果用户已经添加了一些作业,它将显示如下。
[geekflare@localhost ~]# 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 am 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) # # mh dom mon dow command 0 */1 * * * /home/account/scripts/updateAccountStatuses.sh 0 */1 * * * /home/account/scripts/reActivateAccountStatus.sh [geekflare@localhost ~]#cron 表是特定于用户的,这意味着您必须使用特定用户登录才能查看 cron 表列表。
列出特定用户的 Cron
要列出另一个用户的计划作业,请使用-u ( User ) 和-l ( List ) 选项。
crontab -u another_username -l
示例: crontab -u geekflare -l
添加/修改 Crontab 条目
要编辑 crontab 条目,我们可以使用-e选项,如下所示。

crontab -e
上述命令将打开 vi 编辑器,您可以在其中指定作业的详细信息并保存文件。 保存后,您可以使用crontab -l验证是否配置了 cron。
为特定用户添加/修改 Crontab 条目
我们可以使用以下命令为另一个用户编辑 crontab
crontab -u another_username -e 示例: crontab -u geekflare -e
删除 crontab 条目
将<strong>-r</strong>参数与 Crontab 一起使用以删除完整的计划作业,而无需从 crontab 确认
crontab -r
如果您想在删除计划作业之前进行确认,请使用带有-r的<strong>-i</strong>选项,这将在删除用户的 crontab 之前提示用户确认。
crontab -i -r [geekflare@localhost ~]# crontab -i -r crontab: really delete geekflare's 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 * * * geekflare find /tmp -type f -empty -delete
上面的 cron 表达式将从/tmp目录中找到空文件和目录,并将其删除。 该作业将在每天上午 12.45运行。 我们需要提及用户名来执行这项工作。 在上面的示例中, geekflare用户正在执行 cron 作业操作。
使用单个 cron 执行多个任务
* * * * * /home/scripts/backup.sh; /home/scripts/scritp.sh
多个任务/作业可以使用分号 ( ; ) 分隔,并且可以分配给单个 cron 表达式。
Cron 格式化和测试工具
到目前为止,我们讨论了 crontab 的命令和语法来安排任务。 但是,如果您不是系统管理员,并且您的工作不是定期设置 Cron,那么您可能无法记住语法,并且会为错误留出空间。 别担心,我们有办法解决这个问题。
网上有几种 Cron 格式化工具。
# 1. Cron 作业生成器
Cron Job Generator 是一个非常用户友好的 GUI,您可以在其中指定脚本的分钟、天和路径来生成 crontab。
让我们举一个实时示例,我必须在周一到周五之间每 5 分钟执行一次/home/processMonitor.sh 。

所以,我得到了下面的 Cron 语法,我可以通过执行将其放入我的 crontab
crontab –e
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 Job Execution Logs、Email Notification、Separate Failure Logs 等其他用途。
# 3. crontab 生成器
Crontab Generator 是另一个生成 crontab 的便捷工具,使用此工具,您还可以添加是否要将 cron 输出保存到文件或发送到电子邮件。

# 4. Crontab 大师
Crontab Guru 是一个简单的在线 cron 计划表达式编辑器。 此外,它还提供了一种有用的方法来监视您的 cronjob。 我们需要做的就是复制提供的命令并附加到 crontab 定义的末尾。 如果 cron 作业失败或什至没有启动,您将收到一封警报电子邮件。
在下面的示例中,作业将在每天、每月和每周的04:05执行。

# 5. CRON 测试仪
CRON Tester 允许我们测试 cron 时间/日期定义。 在某些情况下,我们必须解码现有的 cron 语法以进行故障排除或只想进行测试。
为此,我们可以使用此工具。 我们需要做的就是将我们的 cron 表达式复制并粘贴到 cron 定义字段中,然后选择迭代次数并单击“测试”以查看它将运行的各个日期。
让我们检查一下我们的 cron 表达式之一4 3 */2 * * ,它应该每两天在03:04(AM)运行一次。 让我们用 cron tester 来验证一下。

结论
我希望以上内容可以帮助您更好地了解 Crontab 并设置 cron 作业。 通过 Cron 调度作业是 Linux Admin 执行的众多任务之一。 如果您有兴趣学习高级技能,请查看本课程。
