CentOS 上的 Crontab 初学者指南
“cron”守护进程是一个内置的 Linux 应用程序,Linux 用户利用它来调度进程的执行。 Cron 在“cron 表”或“crontab”中搜索特定文件和脚本。 crontab 文件提供了一组可以定期执行的命令。它还提供用于管理命令列表的命令的名称。 Crontab 还利用 cronjob 调度程序来执行操作。根据一组指令,Cron 是一个系统函数,将为您执行或执行进程。 Crontab 是计划的名称,也是用于这些修改的实用程序。
在这篇文章中,我们将介绍与 Crontab 相关的以下几点:
历史
Cron 现代版本
什么是 Cronjob?
为什么使用 Cronjob?
定时任务元素
Crontab 工作
crontab 用法
Crontab 语法
表达中的特殊字符
Cron 特殊字符串
环境变量
crontab 变量
Crontab 命令选项
在 CentOS 上安装 Cron
Crontab 调度程序:系统范围
Cron 访问
crontab管理
14 个 Cronjob 示例
为特定用户创建 Cronjob
列出 Cronjobs
创建 Cronjobs 备份
删除 Cronjobs
Cronjob 输出管理
定时任务限制
处理 Cronjob 错误
Crontab 语法生成器
Crontab 的图形前端
那么,让我们一起踏上这段旅程吧!
历史 :
当操作系统为其用户启用多用户模式时,从“/etc/rc”调用cron系统服务。其算法由以下步骤组成:
读取“/usr/lib/crontab”目录。
检查命令是否在当前时间和日期执行,然后以超级用户 root 身份执行命令。
睡一分钟。
从头开始重复步骤 1。
这个版本的cron可靠且简单,但无论是否有任何工作要做,它都会占用资源。在 20 世纪 70 年代末普渡大学的一项实验中,人们发现将 cron 服务扩展到所有 100 个用户的分时 VAX 给系统带来了太大的压力。
Cron 现代版本:
随着 Linux 和 GNU 项目的引入,新的 cron 出现了。 “Vixie cron”由 Paul Vixie 于 1987 年创建,是最常见的 cron。 Vixie cron 版本 3 于 1993 年最后一个季度推出。2004 年 1 月,ISC Cron 更名为版本 4.1。大多数 BSD 和 Linux 发行版使用版本 3,该版本修复了一些小错误。 2007 年,Red Hat 分离了 Vixie-cron 4.1,并于 2009 年添加了 anacron 2.3。Anacron 和 dcron 是另外两个重要的实现。 Anacron 不是一个独立的 cron 程序。它必须由另一个 cronjob 调用。 DragonFly BSD 的创始人 Matt Dillon 创建了 dcron,Jim Pryor 于 2010 年接管了它的维护工作。
Dale Mellor 在 2003 年创建了 mcron,这是一个基于 Guile 的 cron 版本,与 Vixie cron 兼容。它还通过在任务描述和调度计算中包含任何方案代码来实现更大的灵活性。 Mcron 默认安装在 Guix 包管理下。它还保证所需的软件包已安装,并且相关的 crontab 正确引用它们。如果在 Web 托管环境中无法访问 cron 实现,则 webcron 解决方案会设置定期执行的循环任务。
什么是 Cronjob?
Cron 是一个允许您安排任务以便稍后执行的工具。如果您想为以后计划一项一次性作业,您可能希望使用另一个命令。同时,cron 非常适合重复执行任务。
您可能熟悉 Windows 中的后台进程,例如服务。 Cron 是一个守护进程,通过在后台执行任务来执行其功能。在空闲状态下,守护程序等待从工作系统或网络中存在的基于 Linux 的另一个系统完成任务。谈到 cron 文件的结构,我们有一个 cron 文件,一个简单的文本文件,其中包含将在计划时间执行的命令。 “/etc/crontab”是默认的系统crontab文件,它存在于以下crontab目录中:“/etc/cron.*/”。系统管理员可以修改系统crontab文件。
基于 Linux 的操作系统支持众多用户。他们每个人都可以创建自己的 crontab 文件并添加命令以在需要时执行任务。 cron 守护进程将检查 crontab 文件,然后在后台执行该作业。您还可以利用 cronjobs 创建备份、磁盘空间监控以及自动系统维护。 Cron 任务非常适合每周 7 天、每天 24 小时执行的机器。虽然系统管理员主要使用 cron 任务,但它们对于 Web 开发人员也非常有价值。
为什么使用 Cronjob?
Cronjobs 帮助归档数据库表。
删除所有超过一年的日志文件。
发送电子邮件通知,例如密码过期通知和新闻通讯。
它帮助操作系统对数据库和日志文件进行计划备份。
定期清理缓存数据。
它用于自动化系统维护。
它是一个用于自动化 Unix 任务的强大工具。
定时任务元素:
大多数 cronjobs 包含三个部分:
用于运行脚本的命令。
将执行的脚本。
脚本执行的输出。
大多数需要使用 cronjob 的程序都会提供有关如何设置它的详细说明。
crontab 文件:
crontab 文件行要么是“非活动”,要么是“活动”。 “活动”行是 cron 命令条目或环境参数。任何被忽略的行(包括注释)都被视为“无效”。不考虑制表符、前导空格和空行。以符号“#”作为第一个非空格字符的行将被读取为注释并被忽略。在环境变量设置或 cron 命令中,命令不允许存在于同一行中,因为如果这样做,注释将成为 cron 命令的一部分。
crontab 工作:
crontabs 可以在本地目录中找到,例如“/var/spool”或“/var/spool/cron/crontabs”,这是它的子目录。即使它们出现在这两个位置,也可以使用 crontab 命令来完成编辑它们的任务。我们将弄清楚需要哪些组件,然后您才能从 crontab 操作中获得所需的结果。 crontab 中的条目必须出现在第一个命令中。这五个参数表示它们的执行时间以及是否应该执行。可以通过首先使用命令“crontab -e”进入编辑模式来编辑 crontab。一旦您指定了时间作为输入,crontab 就准备好在指定时间运行。
cron 守护进程协助执行必要的检查,以便可以在该实例上执行 crontab 命令。每分钟,crontab 守护进程都会检查 crontab。因此,这个 crontab 包含最新的信息。执行检查后,将使用与当前时间匹配的 crontab 中的字段来执行相关命令。
应避免夏令时期间“丢失时间”等情况,因为该命令甚至可能不会运行一次。另一方面,如果时间出现多次,该命令甚至可能执行两次。另一个例子是连字符“-”可以在一天中多次执行 cronjob。例如,如果有人希望在一天中的第 10 和 11 小时执行 cronjob,则可以使用命令 10-11。执行 cronjobs 的另一个关键方面是允许作业运行的设置。允许或拒绝用户执行 cronjobs 可以通过在 cron.allow 或 cron.deny 文件中进行一些更改来完成。
crontab 用法:
Linux 系统包包含了用于作业调度的“crontab”。因此,以 root 身份执行脚本可以使系统更新更易于维护。它就像更改 cronjob 一样简单,然后等待重新启动过程。
crontab 的语法:
Crontab 的语法由六个字段组成,其中前五个字段与执行日期和时间相关。 crontab 文件中的每个字段按以下顺序存在:
分钟:其值在0-59之间。分钟选项定义 crontab 命令执行的确切分钟。
小时:其值在0-23范围之间。 hour 选项定义 crontab 命令执行的日期。
day:取值范围为1-31。 day 选项指定 crontab 命令执行的日期。
月份:取值范围为1-12或JAN-DEC。月份选项确定 crontab 命令运行的年份中的月份。
weekday:其值介于 0-6 范围或 SUN-SAT 之间。 weekday 选项定义 crontab 命令执行的星期几。
命令:命令选项确定将执行的命令的顺序。
查看 crontab 命令的语法如下:
指定范围:使用“-”连字符定义特定范围:30-50、40-100,或周二至周五、七月至十二月。
出于匹配目的,请使用星号 (*)。
定义多个范围:用户可以定义命令可以分隔的各种字段,例如 DEC-MAY 或 FEB-SEPT。
表达式中的特殊字符:
“?”用于表示以下字段中的“任意”:<day-of-week>和
表示任意值,忽略字段值。例如,我们可以在 参数中输入“?”,以在“每月7号”运行脚本strong> ”,无论这一天是一周中的哪一天。 “*”用于指示所有事件或该事件应该在某个时间单位内发生。例如,在<分钟>字段中,“*”表示每分钟。
“-”代表“范围”。例如,当我们在9-12之间使用“-”时,表示“第9、10、11、12小时”。
增量值使用“/”增量符号指定。例如,在分钟字段中,“10/10”意味着“一小时的 10、20、30、40 和 50 分钟”。
“,”或“逗号”提供一系列值。例如,“TUES, THUR, SAT”表示“TUESDAY, THURSDAY, SATURDAY”。
当用于不同领域时,字母“L”(最后一个)具有不同的含义。根据日历月,如果在
字段中使用“March 31st”,则表示三月的最后一天。使用偏移值,例如“L-2”,表示该月的倒数第二天。 与每月给定日期最接近的工作日(周一至周五)由“W”(工作日)确定。如果我们在
字段中输入“4W”,则表示“该月 4 号附近的工作日”。 “#”表示一个月内第“N”个工作日出现;例如,“二月第二个星期五”将是“2#2”。
Cron 特殊字符串
cron 守护进程有一些使作业定义更容易的快捷方式。
这些单词具有精确的含义,您可以在语法中使用它们来代替 5 列日期规范。以下是 Cron 的一些快捷键:
@hourly:与“0 * * * *”相同,在每小时开始时运行该命令。
@daily:与“0 0 * * *”相同,每天中午 12 点(午夜)运行该命令一次。
@weekly:与“0 0 * * 0”相同,每周日午夜运行该命令。
@monthly:与“0 0 1 * *”相同,在每月第一天的中午 12 点(午夜)运行该命令。
@yearly:与“0 0 1 1 *”相同,每年 1 月 1 日午夜运行该命令一次。
@reboot:每次系统重新启动时,都会执行该命令。
环境变量:
当 cron 运行作业时,在 Crontab 中设置一行的环境可以设置环境变量。
在 Crontab 中,可以添加环境设置:
“value”周围的空格是可选的。此外,括在引号中的字符串用于保留尾随或前导空格。
Cron 自动为您设置一些环境变量:
SHELL 变量设置为“/bin/sh”。
crontab 所有者目录“/etc/passwd”行用于设置HOME 和LOGNAME。 SHELL 和 HOME 可以在运行时通过使用 crontab 设置进行修改,但我们不能对 LOGNAME 进行同样的操作。
有时,变量LOGNAME在BSD系统上被称为“USER”。我们还必须设置“USER”配置。
crontab 变量:
下面列出了一些最常用的 cron 变量:
PATH:这是 cron 将搜索的目录列表。
MAILTO:指定谁通过电子邮件接收每个命令的输出。
HOME:登录用户的主目录。
LOGNAME:当前用户的名称。
LAN:当前区域设置配置
编辑器:文件的默认编辑器。
MAIL:当前用户的邮件存储位置。
术语:终端的当前仿真。
用户:当前登录的用户。
SHELL:当前用户的shell路由,例如bash。
crontab 命令选项:
-u [user]:此选项将帮助您定义用户。
-n [host]:使用“-n”选项设置集群中的任意主机来执行用户的crontab。
-x [mask]:使用“-x”选项启用调试。
-e: 该选项用于编辑用户的 crontab。
-r:要删除用户的 crontab,请使用“-r”选项。
-l: 要列出用户的 crontab,请在 crontab 命令中写出“-l”。
-c:让集群中的主机执行用户的crontab并使用“-c”选项
-i:要在删除之前进行提示,请使用“-i”选项。
-s:使用“-s”选项检查 SELinux 上下文。
在 CentOS 上安装 Cron:
默认情况下,CentOS 8 中包含 cron。出于某种原因,如果您还没有它,请将其安装在您的系统上:
Crontab 调度程序:系统范围
通常,大多数服务都使用 crontab。这些服务直接使用 crontab 调度程序的设置到“/etc/cron.d”目录。之后,调度程序将自动执行该目录中存在的文件。以下是 crontab 预先配置的文件夹:“/etc/cron.hourly”、“/etc/cron.daily”、“/etc/cron.weekly”和“/etc/cron.monthly” 。 Linux 管理员可以完全控制这些目录。同时调度程序定期遍历并执行这些crontab文件。另外,如果root用户想要执行某些操作,例如他想要每天执行某个特定的脚本,他会将文件放在“/etc/cron.daily”目录中。
计划访问:
您可以使用cron分配对任何文件的执行的控制权。使用以下文件评估此功能:
/etc/cron.allow: 允许
/etc/cron.deny: 拒绝
要记住的事情:
如果上述两个文件都丢失,则只有 root 用户可以使用 cron。
使用 cron,在文件前添加名称,无论您要拒绝还是允许任何特定文件名。
如果您不希望任何其他用户使用 cron,请在 cron.deny 文件之前添加行 ALL。
如果 cron.deny 文件中未写入任何内容,则所有用户都可以使用 cron。
如果用户名出现在两个文件中:cron.allow、cron.deny,则该用户仍然可以使用 cron。
假设 cron.deny 中提到了一个用户,但不存在与此相关的 cron.allow 文件;那么除指定用户之外的所有用户都可以使用 cron。
定时管理:
正如我们之前讨论过的 crontab,它是一个包含 cron 执行的作业计划的特定文件。另一方面,这些作业并不意味着可以直接编辑。建议使用 crontab 命令来实现此目的。 crontab 命令允许您编辑与您的用户配置文件相关的 crontab,而无需更改您的权限。此命令还将通知您 crontab 中存在的错误,如果直接编辑,这是不可能的。使用以下命令编辑 crontab:
在Linux系统上,“/etc/目录”包含另一个crontab文件。在上述位置下,存在一个系统范围的 crontab,其中包含一个字段,该字段指定用户配置文件的哪些权限用于执行 cronjobs。使用以下命令更改系统范围的 crontab:
访问和编辑 crontab 文件的另一种更简单的方法是使用“nano”编辑器。按照以下步骤将“nano”设为默认编辑器:
在打开的文件的开头添加以下行:
将添加的行保存在“~/.bash_profile”中并退出。之后,重新加载“~/.bash_profile”文件。
现在,写出以下命令来添加 cronjobs:
这是 crontab 文件,我们将在其中保存所有 cronjobs:
要查看 crontab 文件内容,请使用以下命令:
注意:目前,我们还没有在 crontab 文件中添加任何 cronjob 来打印任何内容。
要删除 crontab 文件中计划的 cronjobs,请写出以下命令:
14 个定时任务示例:
示例 1:每 50 分钟执行一次 Cronjob
以下 crontab 命令将每 50 分钟执行一次“updatedb”:
示例 2:在指定时间和月份执行 Cronjob
在晚上 8:00 执行 /usr/local/bin/testscript.sh 的 Crontab 示例1 月、2 月、3 月和 4 月 20 日:
示例 3:每周五下午 1 点执行 Cronjob
下面给出的命令将让系统每周五下午 1 点执行“testscript.sh”:
示例 4:每分钟执行一次 Cronjob
要每分钟执行特定脚本,请检查此命令的语法:
示例 5:在指定日期执行 Cronjob
如果您想安排一个 cronjob 在特定日期执行,下面的示例将为您提供帮助。此示例将在周一和周三下午 2 点运行“testscript.sh”:
示例 6:每月第一个星期一执行 Cronjob
本例中时间参数设置不够。我们将利用一个条件来指定应在每个月的第一个星期一执行特定脚本:
示例 7:每 10 秒执行一次 Cronjob
再次,我们将指定每 10 秒执行一次 cronjob 的条件:
* * * * * sleep 10; /scripts/script.sh
示例 8:多个任务的 Cronjob 执行
使用 (;) 配置 cron 执行多个命令,如下所示:
示例 9:使用“@yearly”在每年年初执行 Cronjob
当您必须向某人发送新年祝福时,在新年的第一分钟执行任务会很有帮助。“0 0 1 1 *”类似于时间戳“ @每年“:
示例 10:使用“@monthly”在每个月初执行 Cronjob
您可以使用“@monthly”时间戳来执行基于每月的任务,例如向客户开具发票和支付账单:
示例 11:使用“@weekly”在每周开始时执行 Cronjob
在一周开始时执行任何任务,例如使用“@weekly”时间戳进行系统清理。 “每周”相当于“0 0 * * 周一”:
示例 12:使用“@daily”在每个月初执行 cronjob
“@daily”时间戳相当于“0 0 * * *”。它用于执行基于任务的日常工作:
示例 13:使用“@hourly”在每小时开始时执行 Cronjob
“@hourly”时间戳相当于“0 * * * *”。您可以利用此时间戳来执行每小时任务:
示例 14:系统重启的 Cronjob 执行
“@reboot”对于您想要在系统启动时执行的操作很方便。它对于在后台自动启动任务很有用。这种类型的 cronjob 用于安排启动脚本。
为特定用户创建 Cronjob
要为特定用户安排 cronjob,请按以下方式指定其名称:
现在,让我们看一个简单的例子:
此命令将为“linux”用户每 50 分钟执行一次“updatedb”。
列出 Cronjobs:
使用此命令列出系统上计划的 cronjobs:
创建 Cronjobs 备份:
要创建计划的 cronjobs 的备份,请使用以下命令:
验证“cron-backup.txt”的内容以确保 cronjobs 是否备份:
删除定时任务:
方法一:无提示
“crontab -r”命令用于删除 cronjobs:
方法2:有提示
执行以下命令将在删除 crontab 之前显示提示:
定时任务输出管理:
正如我们在 cronjob 介绍中提到的,这些作业在后台运行。这就是为什么他们是否成功完成任务并不总是显而易见的原因。至此,您对 cronjob 调度及其用法有了一些了解。现在,您可以尝试各种 cronjobs 输出重定向的方法。此重定向将帮助您跟踪 cronjobs 的功能。
例如,如果您的服务器上安装并配置了邮件传输代理(例如“Sendmail”),则可以将 cronjobs 的输出发送到与您的 Linux 用户配置文件关联的电子邮件地址。相比之下,crontab 顶部的“MAILTO”设置也可用于手动提供电子邮件地址。将以下几行添加到您的 crontab 文件中,其中有一个“MAILTO”语句,后跟我的电子邮件地址、一个引用 cron 二进制文件所在目录的 HOME 指令、一个 cron 任务,以及一个 SHELL 指令,指示要运行的 shell,在我们的例子中是 bash。
SHELL=/bin/bash
HOME=/
50 * * * * linux updatedb
* * * * * echo ‘Run this command every 50 minutes’
此任务将返回消息“每 50 分钟运行此命令”。输出将通过电子邮件发送到“MAILTO”指令中指定的电子邮件地址。为了避免收到包含结果的电子邮件,您可以将 cron 任务输出重定向到空位置或日志文件。
要将计划命令的输出发送到日志文件:在命令末尾附加>>,并添加包含日志文件的目录的名称和路径,如下所示:
我们为此目的创建了一个示例日志文件,因此我们将按如下方式编写此命令:
定时任务限制:
专用VPS服务器:在这种情况下,cronjob执行时间没有限制。
共享和经销商: cronjob 每 15 分钟运行次数不得超过一次。
处理 Cronjob 错误:
方法一:使用/dev/null
您可以轻松发送我们的 cronjob 错误并记录到 dev/null,而不是接收电子邮件警报。我们发送或写入 dev/null 的所有内容都将被丢弃。
该命令的“> /dev/null”部分指示 cron 将标准输出 (STDOUT) 重定向到 /dev/null。
文件描述符“2”用于标准错误 (STDERR),而标准输出的文件描述符为“1”。
方法 2:将输出发送到特定文件
这是一种流行的方法,大多数用户更喜欢这种方法。在此方法中,您必须创建一个文件来保存 cronjob 日志。如果作业成功完成,它将打印输出;否则,会打印错误。
我们为此目的创建了一个示例日志文件,因此我们将按如下方式编写此命令:
这里 :
“* * * *”表示每小时、每天、每周、每月每50分钟执行一次任务。
Bash shell 的路径和可执行文件是“/bin/bash”。
该目录将更改为“/home/linux”,其中包含 shell-testscript.sh 脚本。
“>>”符号将输出附加到先前创建的文件“samplefile.log”,而单个 > 符号会覆盖该文件。
Crontab 的语法生成器:
从示例的演示中,您可以确定安排 cronjob 是多么容易。有时,您无法记住特定的 cronjob 语法。为了使工作更易于管理,很少有基于 Web 的 cron 语法生成器可供您使用。现在,我们将讨论几个生成 crontab 表达式的网站。这些表达式基于您的输入。根据您的要求生成 crontab 表达式后,只需将该行复制/粘贴到系统的 crontab 文件中即可。
定时任务生成器:
Crontab Generator 是一个基于 Web 的工具,可让您更快、更轻松地创建 crontab 表达式。该网站包含一个包含多个条目的表格。
用户必须填写表格中的所有必要字段。在字段中,您可以根据您的要求选择语法命令的值:
然后这个 Crontab Generator 工具将在下面突出显示的部分中发出命令。复制生成的命令,将其粘贴到您的 crontab 文件中,然后就完成了!
crontab 大师:
该网站是为提供 cronjobs 示例而定制的。你只需在网站上输入你的信息,几分钟后就会生成 crontab 语法。
克朗制造者:
这是另一个网站,也是基于生成 cronjob 命令语法的目的而构建的:
Crontab 的图形前端:
一些 crontab 前端实用程序可用于使用图形用户界面创建 cron 任务。要管理或添加 cron 任务,无需从命令行更新 crontab 文件。这些工具将使管理 cronjobs 变得轻而易举!
时间:
Zeit 是一款用 C++ 计算机语言创建的免费软件应用程序。根据 GPLv3 许可证,可以在 GitHub 上访问该应用程序的源代码。它是一个基于Qt的“crontab”和“at”命令前端。我们可以利用 Zeit 完成以下任务:
添加、修改和删除 crontab 作业。
删除、编辑或添加 crontab 的环境变量。
设置闹钟和计时器。
定时任务界面:
Crontab UI 是一个基于 Web 的解决方案,用于轻松、安全地管理 Linux 中的 cronjobs。您不必手动编辑 crontab 文件来创建、删除和管理 cron 任务。只需点击几下鼠标,您就可以在此网络浏览器中执行所有操作。 Crontab UI 使创建、编辑、停止、删除和备份 cron 任务变得简单。它还在将 cronjobs 导入、导出和部署到其他机器方面发挥作用。
结论:
Cron 是一个多功能且功能强大的工具,可以帮助您完成各种系统管理任务。您可以自动执行通常使用 shell 脚本复杂的操作。本文为初学者提供了完整的 crontab 指南,其中讨论了所有内容,包括 crontab 工作原理、其用法、在 CentOS 上的安装、示例 cronjobs 实际示例以及 crontab 语法生成器。