You are currently viewing 如何在Linux上使用定时任务(教程+示例)

如何在Linux上使用定时任务(教程+示例)

Cron 作业是 Linux 操作系统中一个基础且强大的工具,对于需要在Linux上使用定时任务的系统管理员、开发人员和技术爱好者而言,它们是自动化日常任务的必备利器。

本文旨在深入浅出地阐释 Cron 作业的奥秘。它将为您提供一份全面的指南,详细解释什么是Cron、Cron工作原理,以及最重要的是,如何利用它们在 Linux 系统上自动化重复性任务。

因此,无论您是想设置自动备份文件、在特定时间运行脚本,还是自动化您的个人项目,本文都将向您展示 Cron 作业如何助您轻松实现这一切!

Linux上使用定时任务核心工具Cron

Cron 是类 Unix 操作系统(包括 Linux 和 macOS)中基于时间的作业调度程序。它使用户能够安排作业(命令或脚本)在固定时间、日期或间隔定期运行。

它最常用于自动执行系统维护或管理任务,但它可以用于任何需要定期、按计划执行命令的用途。

Cron工作原理

后台的核心组件是名为 crond 的 cron 守护进程。它的主要工作是检查计划任务并在指定时间到达时执行它们。

守护进程每分钟唤醒一次,以检查 crontab 文件或基于目录的配置中的作业。这自然会将我们带到 Cron 的下一个知识点,即它使用的文件和目录。

Cron 文件和目录

Crontab 文件是 cron 作业调度系统的核心。“Crontab”代表“cron 表”,因为这些文件包含在预定时间运行的命令列表。

crontab 文件中的每一行代表一个单独的作业,并包含有关何时运行作业的信息,后面是要执行的命令。

本质上,crontab 文件有两种:个人用户拥有的文件和系统范围的etc/crontab。以下是您应该了解的有关这两种文件的关键细节。

但在此之前,需要澄清一些重要的事情。属于个人用户的 cron 文件不保存在其主目录中,而是保存在“/var/spool/cron”目录中。同时,系统服务和应用程序的 cron 作业文件通常放在/etc/cron.d中。

用户 Crontabs

用户 crontab 是系统上每个用户的个人任务。用户可以拥有自己的 crontab 文件,以根据自己的用户 ID 安排任务。

用户 crontab 的主要优势在于,它们允许各个用户管理自己的作业计划,而无需管理权限。

系统范围的 Crontab

与用户特定的 crontab 文件不同,/etc/crontab是一个系统范围的配置文件。它遵循与用户 crontab 略有不同的格式,包括一个用户字段,该字段指定应在哪个用户帐户下运行命令。

这允许系统管理员安排作业在任何用户下运行,而无需修改该用户的 crontab,从而允许在不同用户帐户之间更灵活地管理任务。

通常,/etc/crontab 文件通常用于需要以管理权限运行或对系统运行至关重要的作业。

另一个要点是,虽然用户可以编辑他们的 crontab 条目,但系统范围的 crontab 只能由 root 用户直接编辑。

Cron 的目录

除了 crontab 文件外,大多数 Linux 系统还包含一组目录,供 cron 扫描以查找计划作业:/etc/cron.daily/etc/cron.hourly/etc/cron.weekly/etc/cron.monthly

这些目录允许更直接地安排需要定期运行的任务,而无需在 crontab 中指定确切的时间。

放置在这些目录中的脚本和可执行文件分别每天、每小时、每周或每月运行一次。这些目录中脚本的确切执行时间由/etc/crontab中的配置或守护进程的配置文件(通常位于/etc/cron.d/)确定。

Cron 语法基础

cron 作业由 Cron 文件 (crontab) 中的一行文本定义。每行由一系列由空格或制表符分隔的字段组成,后跟要执行的命令或脚本。cron 作业的基本语法如下:

其实英语懂一点的马上就能明白这个脚本大致格式。接下来我会详细讲解每个组件:

Minute (0-59)

此字段指定命令运行的分钟。它可以是 0 到 59 之间的值。例如,将其设置为 0 将在整点运行命令。

Hour (0-23)

小时字段以 24 小时格式指定。它决定在一天中的哪个小时执行命令。例如,将其设置为 14 将在下午 2 点运行命令。

Day of Month (1-31)

此字段指定命令将在每月的哪一天运行。它可以是 1 到 31 之间的任意值,具体取决于月份的天数。例如,将其设置为 1 将在每月的第一天运行命令。

Month (1-12)

月份字段决定命令将在哪个月份执行。它可以是 1(一月)到 12(十二月)之间的值。例如,将其设置为 12 将在十二月执行命令。

Day of Week (0-6)

此字段指定命令应在星期几运行。它可以是 0(星期日)到 6(星期六)之间的值(因为计算机方面大部分都是欧美国家人发明的,所以周日被认为是一周的第一天)。例如,将其设置为 5 表示每周五运行该命令。

Command or Script

最后,命令或脚本字段用于指定 cron 作业应执行的操作。这可以是任何命令,也可以是 Cron 守护程序将在指定时间执行的脚本文件路径。例如,python3 script.py表示某个时刻运行python脚本。

Cron 语法中的特殊字符

Cron 语法还支持使用特殊字符来指定更复杂的调度模式:

  • 星号 (*):表示“每个”时间单位。例如,小时字段中的“*”表示“每小时”。
  • 逗号 (,):允许指定值列表。例如,day_of_week 字段中的“1,3,5”表示“在星期一、星期三和星期五运行”。
  • 连字符 (-):指定值范围。例如,小时字段中的“9-17”表示“从上午 9 点到下午 5 点每小时”。
  • 斜线 (/):指定增量。例如,分钟字段中的“*/10”表示“每 10 分钟”。

除此之外,cron 作业还有特殊的快捷字符串,可以替换时间和日期的五个字段。这些快捷方式提供了一种快速方法来指定相同的计划,否则需要使用数字表示。

字符串含义
@reboot在启动时运行一次指定的命令。
@yearly, @annually两者均于 每年 1 月 1 日凌晨 12:00 运行指定的任务。相当于指定“0 0 1 1 *”
@monthly每月 1 日凌晨 12:00 运行一次该作业。相当于“0 0 1 * *”
@weekly每周日凌晨 12:00 运行一次作业。相当于“0 0 * * 0”
@daily, @midnight两者均在 每天 凌晨 12:00 运行 cronjob。这相当于在 crontab 文件中指定“0 0 * * *”。
@hourly每小时开始运行一次作业。相当于“0 * * * *”

Cron Job 何时开始?

cron 系统每分钟对 crontab 进行一次检查。当设置的时间(分钟、小时和月份)与实际时间一致时,它会运行任务。此外,它还会检查日期:如果月份中的特定日期或星期几与今天匹配,那么就该执行命令或脚本了。

Cron 作业和路径

当 cron 作业运行时,它会在受限环境中运行,这意味着它不会自动继承用户或系统的环境变量或路径。这可能会导致 cron 作业失败,因为它由于路径未定义或不正确而无法找到必要的可执行文件或脚本。

鉴于此,您可以在 crontab 文件中明确设置 PATH 环境变量来处理 cron 作业中的路径。这会告诉 cron 守护程序在哪里查找可执行文件。例如:

在 crontab 文件的开头添加此行可确保下面的所有 cron 作业都将在这些目录中搜索可执行文件。

但是,考虑到并遵循最佳实践,我们建议始终为 cron 作业中的所有可执行文件和脚本指定绝对路径,以避免任何歧义和潜在错误。

此外,在依赖自动执行之前,请使用 crontab 中定义的相同路径和环境设置手动运行脚本或命令,以确保它们按预期工作。

设置和管理 Cron 作业

好的,现在让我们把理论放在一边。您已经掌握了有关 cron 作业如何运作及其组件的所有基本知识。现在是时候深入研究令人兴奋的部分了:创建 cron 作业任务。

创建用户的 Cron 作业

要创建或编辑用户的 crontab 文件,请在终端中使用以下命令:

这是用户创建和编辑 cron 作业的标准方式。执行后,它会通过在系统设置的默认文本编辑器(例如 Vi、Nano 或其他编辑器)中打开用户的 crontab 文件来编辑运行该命令的用户的 cron 作业。

如果这是您第一次使用该命令,系统可能会提示您选择编辑器,然后再继续。

crontab

接下来,要添加 cron 作业,只需按照上面解释的语法在 crontab 文件中添加新行即可。例如,我们将安排位于用户主目录中的备份脚本“backup.sh”每天凌晨 3:00 运行,方法是添加以下行:

脚本定时执行

文件开头的许多行以“#”符号为前缀,因此被注释掉,它们可作为设置 cron 作业的简明指南。在它们后面输入您的内容,如上图所示。

接下来,保存并退出编辑器。请记住,Cron 服务会自动检查 crontab 文件的更改并相应地应用它们,因此您无需在进行更改后重新启动它。

最后,值得注意的是,使用 crontab -e 提供了额外的好处,即在您保存并退出文件时自动检查语法。Cron 会提醒您检测到的任何错误,从而提供宝贵的保障,防止意外输入无效的 cron 作业。

创建系统范围的 Cron 作业

由于 crontab -e 专注于单个用户 crontab,因此它不适用于某些管理任务可能需要的系统范围的 Cron 配置更改。

如果是这种情况,直接编辑etc/crontab文件即可获得系统范围的 crontab 功能。与用户特定的 crontab 不同,此文件可以包含系统范围的任务,并支持为每个任务指定用户,从而为在不同用户帐户下运行命令提供了灵活性。

例如,让我们创建一个系统范围的 cron 作业,该作业将在凌晨 2:00 从“/var/log/myservice”目录中删除所有带有“.log”扩展名的文件。

为此,我们首先使用我们首选的终端编辑器打开etc/crontab文件:

然后我们进入 cron 作业,它看起来像这样:

任务作业结构

它与用户 cron 作业的区别在于,在最初的五个时间字段后添加了一个额外的列。此列允许指定作业将在其下执行的用户帐户 – 在本例中为 root。

但是,直接编辑etc/crontab文件有两个主要缺点。首先,这种方法不提供语法检查,增加了出错的风险。

第二个原因是etc/crontab会影响整个系统;错误的输入可能会产生广泛的影响,可能会影响系统的稳定性或安全性。因此,请谨慎使用。

列出用户 Cron 作业

为了确保您的 cron 作业已正确安排,您可以使用以下命令显示用户的 crontab 文件内容:

列出所有任务

此命令列出为您的用户安排的所有 cron 作业,允许您验证或查看要运行的任务。

列出系统范围的 cron 作业

正如我们已经知道的,系统范围的 cron 作业存储在不同的位置,并且未在用户的 crontab 中列出。要列出系统范围的 cron 作业,您需要查看/etc/crontab文件和目录/etc/cron.d//etc/cron.daily//etc/cron.hourly//etc/cron.weekly//etc/cron.monthly/

您可以使用 cat 命令或任何文本编辑器查看这些文件。例如:

要列出目录的内容,例如“/etc/cron.daily”,请使用:

查看任务配置文件

列出其他用户的Cron作业

如果您具有超级用户 (root) 权限,则可以使用 crontab 命令,使用“-u”选项,后跟用户名和“-l”选项,列出系统上任何用户的 cron 作业。例如,要列出名为“bobby”的用户的 cron 作业,您可以运行:

此命令对于跨多个用户帐户管理 cron 作业的系统管理员来说非常方便。

编辑Cron作业

要编辑 cron 作业,与创建类似,使用以下命令在默认编辑器中打开当前用户的 crontab 文件:

打开 crontab 文件后,导航到包含要编辑的 cron 作业的行,并根据需要修改计划或命令,然后保存并退出文件。

如果您需要编辑其他用户的 crontab 文件(假设您拥有必要的权限),例如用户“bobby”,请使用:

删除Cron作业

根据您的目标,您可以使用多种方法来删除 cron 作业。要仅删除特定作业,请使用 crontab -e 命令打开 crontab 文件。

从那里,导航到代表您要删除的作业的行。通过完全删除该行来删除它。同时,注意保持所有其他行不变。之后,保存更改并退出编辑器。

但是,如果您希望删除用户的所有计划 cron 作业,则可以删除用户的 crontab 文件。此操作将删除所有计划任务,因此应谨慎执行。

打开终端并输入下面显示的命令:

删除当前用户定时任务文件

这将删除当前用户的 crontab 文件,且不显示确认提示,因此请确保在执行之前要继续。

如果您希望在删除前收到确认提示,请使用命令“crontab -i”后跟“-r”。这将在删除 crontab 文件之前要求确认。

Crontab备忘录

为了总结上面讨论的有关 crontab 命令主要选项的要点,下表简要概述了它们。

命令说明
crontab -e编辑 crontab 文件,如果该文件不存在则创建一个。
crontab -l显示 crontab 文件的内容。
crontab -r删除整个 crontab 文件。
crontab -u user与其他选项配对时,此功能可修改或查看用户的 crontab 文件,此功能仅为具有管理员权限的用户保留。

如何排除Cron作业故障

不幸的是,当 cron 作业无法运行时,这可能会令人沮丧,并且可能会出现问题,具体取决于任务。因此,这里有一些调查原因的基本准则。

故障排除的第一步是确保正确定义了 cron 作业。验证每个字段是否根据您的要求正确指定。常见的错误是语法不正确或误解了 cron 如何解释特殊字符和范围。

然后,确保 Cron 守护程序正在您的系统上运行。您可以通过运行以下命令来检查这一点:

查看任务状态

确保您的 cron 作业尝试运行的脚本或命令具有适当的权限,并且您使用绝对路径。Cron 作业在具有最小 PATH 定义的受限环境中运行,因此指定任何命令或脚本的完整路径至关重要。

此外,该文件必须是可执行的,并且可供安排 cron 作业的用户访问。尝试使用 cron 作业使用的同一用户帐户从命令行手动运行命令或脚本。

这可以帮助您验证命令在没有 cron 环境的情况下是否按预期工作。如果命令失败,您就会知道问题出在命令或脚本上,而不是 cron。

请记住,cron 作业在非交互式、非登录 shell 环境中运行,这意味着它们可能无法访问与手动运行命令时相同的环境变量。

如果您的脚本依赖于环境变量,您可能需要在脚本开头或 cron 作业定义中明确设置它们。

Cron作业示例

最后,我们将介绍几个 cron 作业示例,这些示例涵盖了几乎所有可能的 Cron 语法情况。请将这些示例作为您自己编写 cron 作业的基础。

CommandExplanation
* * * * *每分钟运行一次 cron 作业。
0 * * * *每小时运行一次 cron 作业。
0 0 * * *每天午夜运行 cron 作业。
0 2 * * *每天凌晨 2 点运行 cron 作业。
0 0 15 * *每月 15 号午夜运行 cron 作业。
0 0 0 12 *在星期六午夜运行 cron 作业。
0 0 * * 6从周一到周五每天下午 3 点运行 cron 作业。
0 15 * * 1-5从周一到周五每天下午 3 点运行 cron 作业。
*/5 * * * *每 5 分钟运行一次 cron 作业。
0 8-16 * * *每天从上午 8 点到下午 4 点准时执行 cron 作业。
0 4 * * 2,4在周二和周四凌晨 4 点运行 cron 作业。
@reboot在系统启动时运行 cron 作业。

最佳实践和技巧

  • 在使用 Cron 安排脚本之前,请先手动测试它们,以确保它们按预期工作。
  • 在 crontab 文件中对命令和脚本使用绝对路径,以避免路径问题。
  • 将输出重定向到文件或邮件,以捕获任何输出或错误以进行故障排除(“command > /path/to/logfile 2>&1”)。这样,您就可以查看日志文件以查找任何问题。
  • 安排作业时,请注意系统负载,尤其是当作业占用大量资源或您在同一时间安排了许多作业时。

总结

Cron 作业对于 Linux 系统管理至关重要。它们为安排和自动化任务提供了强大而多功能的工具。

它的美妙之处在于它的多功能性和精确性。从以分钟为间隔执行的简单命令到为特定日期和时间安排的复杂脚本,cron 可适应许多要求。

借助用户和系统范围的 crontab 文件以及为定期任务指定的目录,cron 作业为个人用户和系统管理员提供了灵活性,使他们可以根据自己的特定需求定制任务调度。

通过利用本文中的讲解和示例,您将顺利实现调度成功、提高生产力并在 Linux 之旅中解锁新的可能性。

相关教程文章推荐:零基础搭建PDF在线工具网站教程:打造你的专属效率神器