Linux 中的 Crontab:作业调度示例

⚡ 智能摘要

Linux 中的 Crontab 使用 cron 守护程序安排命令在固定的时间、日期或间隔自动运行,使管理员能够自动执行备份、日志清理、通知和例行系统维护,而无需任何人工干预。

  • 定时任务守护进程: cron 后台进程读取 crontab 文件,并在您设定的精确时间运行每个计划任务。
  • 🗂️ Crontab 格式: 运行命令前有五个时间字段——分钟、小时、日期、月份和星期几。
  • ✍️ 编辑工作: 使用 crontab -e 添加或更改任务,使用 crontab -l 列出任务,使用 crontab -r 删除任务。
  • 🔁 特殊字符串: @reboot、@daily、@weekly 和 @hourly 等快捷方式可以替换常用日程安排中的五个时间字段。
  • 📅 实际例子: 现成的条目涵盖每五分钟一次、特定工作日、每月运行和启动任务。
  • 🤖 人工智能辅助: AI 助手和 GitHub Copilot 可以在几秒钟内生成并解释 cron 表达式。

Linux 作业调度中的 Crontab 示例

Crontab,全称为 cron 表,是一个配置文件和命令,用于驱动定时任务。 Linux 作业调度。以下各节将解释 crontab 格式、添加、列出和删除作业的命令、特殊的 @ 字符串以及可直接使用的调度示例。

什么是 crontab?

Cron 的名字来源于希腊语“Chronos”,意为时间。它是一个系统进程(守护进程),可以按照设定的时间表自动执行任务。Cron 是一组用于运行定期计划任务的命令。Crontab 代表“cron 表”,它允许你使用 cron 作业调度程序来执行这些任务。

Crontab 也是用于编辑该计划任务的程序名称。它由 crontab 文件驱动——该文件是一个配置文件,列出了要按照指定时间表定期运行的 shell 命令。

为什么要使用定时任务?

以下是使用 Linux 系统中 cron 作业的主要原因:

  • 按计划备份日志文件或数据库。
  • 自动删除旧的日志文件。
  • Archi执行并清除数据库表。
  • 发送通知邮件,例如新闻简报或密码过期提醒。
  • 定期清理缓存数据。
  • 自动化执行重复性的 Unix 和 Linux 任务。
  • 自动执行日常系统维护。

如何在 Linux 中使用 cron?

Linux 系统软件包包含一个名为 crontab 的实用任务调度器。crontab 之所以受欢迎,是因为它可以将任务调度为以 root 用户身份运行,从而简化了系统自动化更改。您只需更改一次任务,然后等待它按计划再次触发即可。

Linux Crontab 格式

Linux crontab 条目包含六个字段。前五个字段定义执行时间和日期,第六个字段包含要运行的命令。

Crontab 语法:

[Minute] [hour] 
[Day_of_the_Month] 
[Month_of_the_Year] 
[Day_of_the_Week] 
[command]

下图将 crontab 条目中的每个星号映射到它所控制的字段,从分钟到星期几,后面跟着要执行的命令。

Linux crontab 格式图,显示了五个时间字段和命令

五个时间字段接受以下值:分钟(0–59)、小时(0–23)、日期(1–31)、月份(1–12 或 1 月–12 月)和星期几(0–7,其中 0 和 7 都表示星期日)。您可以使用以下特殊字符控制每个字段:

  • 星号 (*): 匹配该字段的所有可能值。
  • 定义一个范围: 使用连字符设置范围,例如 1-10、30-40、jan-mar 或 mon-wed。
  • 定义多个范围: 使用逗号连接日期范围,例如 apr-jun,oct-dec。

如何添加/修改 Crontab

用户可以使用以下 crontab 命令编辑自己的 crontab 任务。-u 选项指定特定用户的 crontab,因此请提供用户名,如后面的示例所示:

$ crontab -u -e 

上面的命令会打开您系统的个人 crontab 配置,您可以使用默认文本编辑器对其进行编辑。

无需重启 cron;它会自动应用您的更改。要查看当前任务,请使用:

$ crontab -l

要删除 crontab 任务,请使用以下命令:

$ crontab -r

要在 crontab 中添加或更新任务,请使用以下命令:

crontab -e

要编辑其他用户的 crontab,请使用 -u 选项指定用户:

crontab -u username -e

如何列出 Crontab

查看当前用户的 crontab 条目:

crontab -l

要查看特定用户的 crontab 条目:

crontab -u username -l

重要的 crontab 示例

以下是一些重要的、可直接使用的 crontab 计划任务示例:

描述 命令
运行各项调度任务。以下命令每天早上 7 点和下午 5 点执行。
0 7,17 * * * /scripts/script.sh
每 5 分钟执行一次定时任务。
*/5* * * * *  /scripts/script.sh
每隔一段时间执行一次任务 Monday 凌晨 5 点。这有助于执行系统清理等每周任务。
0 5 * * mon  /scripts/script.sh
每隔 3 分钟运行一次脚本。
*/3 * * * * /scripts/monitor.sh
安排一个定时任务,在特定月份执行——这里是二月、六月和九月。
* * * feb,jun,sep *  /script/script.sh
在选定的日期执行。此示例运行每个 Monday 以及星期三下午 5 点。
0 17 * * mon,wed  /script/script.sh
允许 cron 在每个月的第一个星期六执行。
0 2 * * sat  [ $(date +%d) -le 06 ] && /script/script.sh
每隔 6 小时运行一次脚本,配置如下。
0 */6 * * * /scripts/script.sh
安排一个任务在某日执行两次 Monday 和星期二。使用以下设置来执行此操作。
0 4,17 * * mon,tue /scripts/script.sh
安排一个定时任务,每 15 秒执行一次。
* * * * * /scripts/script.sh
* * * * *  sleep 15; /scripts/script.sh
按年安排任务。@yearly 类似于“0 0 1 1 *”。它会在每年的1月1日午夜运行一次任务——非常适合发送新年祝福。
@yearly /scripts/script.sh 
每月运行一次任务。@monthly 类似于“0 0 1 * *”。它会在每个月的第一天午夜运行任务。
@monthly /scripts/script.sh
使用单个 cron 条目执行多个任务。
* * * * * /scripts/script.sh; /scripts/scrit2.sh
每周安排任务。@weekly 类似于“0 0 * * 0”。它会在每周日午夜运行系统清理等每周例行任务。
@weekly /bin/script.sh
每日定时执行任务。@daily 类似于“0 0 * * *”,它会在每天午夜运行一次任务。
@daily /scripts/script.sh
每小时运行一次任务。@hourly 类似于“0 * * * *”,它会在每个整点开始时运行任务。
@hourly /scripts/script.sh
系统重启时运行任务。@reboot 参数适用于系统启动时需要运行的任务,可以让后台作业自动启动。
@reboot /scripts/script.sh

常见问题

用户 crontab 文件存储在 /var/spool/cron/ 目录下(在 Debian 系统上为 /var/spool/cron/crontabs/ 目录)。 Ubuntu用户 crontab 文件位于 /etc/crontab 和 /etc/cron.d 目录中,而系统级 crontab 文件则位于 /etc/crontab 和 /etc/cron.d 目录中。请始终使用 crontab -e 编辑用户 crontab 文件,而不要直接打开这些文件。

Cron 只会在预定的时间运行任务,如果机器断电则会跳过这些任务。Anacron tracks 会处理错过的任务,并在系统恢复运行时运行这些任务,因此它适合那些并非始终处于运行状态的笔记本电脑和台式机。

Cron 使用精简环境,因此路径受限通常是导致问题的原因。请使用绝对路径来指定命令和脚本,并将脚本设置为可执行文件,并将输出重定向到日志文件,以便捕获任何错误进行调试。

在命令后添加 `>> /path/to/logfile 2>&1`,即可将标准输出和错误信息捕获到文件中。或者,在 crontab 文件顶部设置 MAILTO 变量,以便 cron 将每个作业的输出通过电子邮件发送到该地址。

/etc/cron.allow 和 /etc/cron.deny 文件控制访问权限。如果 cron.allow 文件存在,则只有其中列出的用户才能使用 crontab。如果只有 cron.deny 文件存在,则除列出的用户之外的所有用户都可以调度任务。

使用 `crontab -e` 创建的用户 crontab 文件包含五个时间字段,后跟命令。系统文件 `/etc/crontab` 会添加一个字段,用于指定运行任务的用户,其顺序为:分钟、小时、日、月、星期、用户,最后是命令。

是的。机器学习工具可以建立作业正常运行时间和完成时间的基准线,然后标记异常情况,例如运行时间过长、静默失败或错过预定时间的作业。人工智能日志分析还可以将相关错误分组,从而加快根本原因分析工作。

是的。 GitHub 副驾驶 可以根据纯英文注释生成 cron 表达式,解释类似 */5 * * * * 这样的调度指令的作用,并编写作业运行的 shell 脚本。在将表达式添加到生产环境的 crontab 之前,务必先进行测试。

总结一下这篇文章: