Ubuntu Crontab2024年10月9日 | 12 分钟阅读 有时,我们不希望进程在操作系统设置的默认时间执行,而是希望自己设定进程的执行时间。为此,我们在 Ubuntu 中应用 cron 守护进程,它的实现方式类似于 Windows 操作系统的任务计划程序。我们可以使用 cron 守护进程来描述备份或维护作业等进程应运行的时间。通过这种方式,我们可以自动化任务,使其在稍后执行,而无需手动干预。 在本文中,我们将解释如何使用 Ubuntu 上的 Crontab 来实现这一点。 Crontab 简介crontab 是一个用于定期执行的命令列表,也是用于管理该列表的命令名称。它之所以被称为 “cron table”,是因为它应用了 cron 作业计划程序的任务。 Cron 本身得名于 “Cronos”,这是希腊语中表示时间的词。它是一个系统进程,将根据设定的计划自动为我们执行各种任务。计划被称为 crontab,它是用于编辑该计划的程序的名称。 换句话说,crontab 是一个用于安装、卸载或列出驱动 Vixie Cron 中 cron 守护进程的表的程序。cron 文件包含对 cron 守护进程的正常形式的指令:“在此日期、此时执行此命令”。所有用户都可以拥有自己的 crontab,因此它们是 /var 目录内的文件,并且不打算直接编辑。crontab 文件是一个配置文件,它代表要定期为特定计划执行的 shell 命令。 如果给定了选项,即 -u,它描述了要提取其 crontab 的用户名。如果未给出选项,Crontab 会考虑“您的”crontab,即运行命令的人的 crontab。 注意:su 会使 crontab 复杂化,如果我们正在以 su 身份执行,出于安全考虑,我们应始终使用 -u 选项。Cron 文件用于从一些标准输入或命名文件安装新的 crontab,如果给出了“-”伪文件名。Cron 的历史Cron 的早期版本在 Version 7 Unix 中,cron 是一项服务(后来称为守护进程),在 OS 进入多用户模式时从 /etc/rc/ 目录调用。cron 的算法很简单: - 读取 /usr/lib/crontab 目录。
- 确定是否必须在当前时间和日期执行命令,如果是,则以 root 或超级用户身份执行它们。
- 睡眠一分钟。
- 从头开始重复步骤。
cron 版本虽然健壮且基础,但即使没有要执行的工作,它也会消耗资源。在 20 世纪 70 年代末,普渡大学的一项实验发现,将 cron 服务扩展到分时 VAX 上的每 100 个用户会给系统带来过大压力。 多用户功能随着 Unix System V 的发布,cron 的下一个版本被创建,以将 cron 的功能扩展到 Unix 系统的每个用户,而不仅仅是超级用户。尽管今天这可能显得不重要,因为几乎所有 Unix 和类 Unix 系统都有一些用户和强大的处理器;但当时它需要一种新的方法,在一个单 MIPS 系统上拥有大约 100 个用户账户。 1977 年 8 月的《通信 ACM》杂志上,Kurt Maly 和 W.R. Franta 发表了一篇题为“用于模拟事件集的有效数据结构”的文章,指定了一种用于各种事件驱动模拟系统的事件队列数据结构,该数据结构显示出“性能优于大多数使用的通用链表算法”,良好的性质提供了时间分布(非均匀)。 - 普渡大学的学生 Robert Brown 在审阅了这篇文章后,发现了离散事件模拟器和 cron 之间的相似之处,并实现了 Franta-Maly ELM(事件列表管理器)用于实验。
- 在虚拟时间中,执行各种事件模拟器,尽快从事件队列中取出许多事件,并将它们的“当前”概念传递给下一个事件的计划时间。
- 将事件模拟器在“实时”而不是虚拟时间中执行,创建了一个 cron 版本,该版本几乎所有时间都用于睡眠,并等待计划时间来运行事件列表头部的任务。
- 在研究生课程中,下一学年迎来了新学生,如 Keith Williamson,他参与了计算机科学系的系统工作人员。
现代版本随着 Linux 和 GNU 项目的出现,出现了新的 crons。其中最常见的是 Vixie cron,最初由 Paul Vixie 于 1987 年编写。Vixie cron 版本 3 于 1993 年底发布。4.1 版本被重命名为 ISC Cron,并于 2004 年 1 月发布。3 版本几乎在所有 BSD 和 Linux 发行版中使用,并进行了一些小的错误修复。 Red Hat 于 2007 年将 vixie-cron 的 4.1 版本分支到 aronie 项目,并于 2009 年包含了 anacron 的 2.3 版本。 其他著名的实现包括 dcron 和 anacron。然而,anacron 并不是一个独立的 cron 程序。dcron 由 DragonFly BSD 的创始人 Matt Dillon 创建。 Linux Crontab 的格式Crontab 语法下面列出了一些重要字段、它们的描述和允许的值 - MIN (分钟字段) - 0-59
- HOUR (小时字段) - 0-23
- DOM (月份中的日期) - 1-31
- MON (月份字段) - 1-12
- DOW (星期中的日期) - 0-6
- CMD (命令) - 要运行的命令。
在字段中描述多个值- 星号 (*) 运算符表示任何字段的所有可能值。
例如,每天或每小时。 - 逗号 (,) 运算符表示值列表。
例如, "1,3,4,7,8". - 连字符 (-) 运算符表示值范围。
例如,“1-6”等同于“1,2,3,4,5,6”。 - 斜杠 (/) 运算符可用于跳过给定的数值。
例如,小时时间字段中的“*/3”等同于“0,3,6,9,12,15,18,21”;“*”表示“每小时”,但“/3”仅定义第一个、第四个、第七个……以及“*”提供的此类值将应用。
Crontab 标签一些标签及其描述如下 - -h, --hash
它描述了要应用于密码哈希的哈希。此标签仅与 create 操作相关。哈希字符串已获准用于 libgcrypt,因此支持 gcrypt 接受的所有哈希。 - -c, --cipher
它设置了密码规范字符串。通常是 “aes-cbc-plain”。它适用于 2.6.10 之前的内核,因为它们不理解新的密码规范字符串。它也适用于 “aes-cbc-essiv-:sha256” 以使用 ESSIV。 - -y, --verify-passphrase
它会两次询问密码。这在首次创建映射或执行 luksFormat 时很有用。 - -d, --key-file
它使用文件作为密钥材料。通过 -d 选项与 LUKS 导入密钥材料的密钥文件始终用于存在密码。如果您希望通过密钥文件设置新密钥,则需要为 luksAddKey 或 luksFormat 使用位置参数。 - -s, --key-size
它设置了密钥的大小(以位为单位)。通常是 128、192 或 256。它可以用于 luksFormat 或 create,所有其他 LUKS 操作都将忽略此标志,因为密钥大小由分区头指定。 - -b, --size
它强制底层设备的扇区大小。 - -o, --offset
它在后端设备中启动偏移。 - -p, --skip
它确定在开始时要跳过的加密数据扇区的数量。这与 offset 选项不同。 - --readonly
它设置了只读映射。 - -i, --iter-time
它指定了用于 PBKDF2 密码处理的微秒数。它仅与 LUKS 的密钥设置操作相关,如 luksAddKey 或 luksFormat。 - -q, --batch-mode
此选项不请求确认。它仅与 luksFormat 相关。 - -t, --timeout
它指定了在超时前等待的秒数。它每次询问密码时都会相关,例如 luksAddKey、luksFormat、luksOpen 或 create。 - --align-payload=value
它指定了将 payload 对齐到 512 字节扇区的边界值。它与 luksFormat 相关。如果我们的块设备位于 RAID 上,则有助于将文件系统对齐到完整的条带边界,以便它能够利用 RAID 的几何结构。payload 默认对齐到 8 扇区边界。 - --version
它显示版本。
Crontab 操作它可以使用由设备支持的 来创建映射。它有几个选项,如 --readonly、--skip、--offset、--key-size、--key-file、--verify-passphrase、--cipher、--hash 等。一些 crontab 操作及其描述如下: - remove: 它可以移除先前的映射 ,并且没有选项。
- status: 它可以报告映射 的状态。它也没有选项。
- reload: 它更改已启用的映射 。它具有与 create 类似的选项。
- resize: 它可以调整已启用的映射 的大小。必须在此操作中包含 --size 选项。
Cron 表达式Cron 表达式是六个或五个由空格分隔的字段组成的字符串,它们表示一组时间,通常作为运行某些例程的计划。 星期和月份缩写不区分大小写。 用户字段出现在特定系统 crontab 文件中的命令之前。通常,它被固定为“root”。 - 星号 (*): 也称为通配符,表示“所有”。例如,使用“* * * 1”将在每周一的每一分钟执行。使用“* * * *”将在每分钟执行。使用 6 个星号表示每秒(如果支持秒)。
- 连字符 (-): 它表示范围。例如,“2000-2010”表示 2000-2010 年之间的所有年份。
- 逗号 (,): 用于分隔列表项。例如,使用“MON,WED,FRI”表示五字段中的星期一、星期三和星期五。
- 百分号 (%): 除非用反斜杠 (\) 转义,否则百分号将被转换为空格。
- 非标准字符
一些非标准字符如下,并且仅存在于某些 cron 实现中,例如 Quartz Java 调度器。- W: 此字符允许用于月份中的日期字段。它用于定义最接近指定日期的星期几。
- L: “L”是“last”的缩写。它允许在字段(例如月份中的日期)中使用时指定构造。
- Hash (#): 它允许用于星期中的日期字段,并且必须后跟一个 1-5 之间的数字。
在 Ubuntu 中使用 Crontab 进行任务调度我们需要按照以下步骤进行。 - 首先,我们需要通过按快捷键 Ctrl+T 来启动终端窗口,或者单击任务栏上的终端图标,或者在搜索栏中找到终端并按 Enter 键。
- 现在,我们需要在终端窗口中输入 crontab 命令,然后按 Enter 键打开 crontab 文件。
命令如下: - 当我们按下 Enter 键后,终端窗口会要求我们选择一个编辑器来打开此文件。
- 选择第二个选项并按 Enter 键选择 nano 编辑器,因为它对于使用 nano 编辑器打开系统文件总是很好。
- 当我们按下 Enter 键后,我们会发现终端窗口已转换为 nano 编辑器屏幕,并且我们的 crontab 文件已在编辑器中打开。屏幕将显示如下:
- 我们可以使用向上和向下箭头键滚动此文件。此文件中以 '#' 开头的每一行都表示注释。如果我们希望包含一个新任务在设定的时间安排执行,那么我们应该在没有 # 的情况下编写它。
- 例如,如果您希望每周凌晨 5:00 执行所有用户帐户的备份,那么您应该输入以下命令:
0 5 * * 1 tar -zcf /var/backups/home.tgz /home/ 结果将如下所示:- 完成包含任务后,我们只需按 Ctrl+O 快捷键在 nano 编辑器中保存 crontab 文件。它将在右上角显示更改状态,并提示我们输入要写入的文件名。我们只需按 Enter 键选择默认值。
- 按下 Enter 键后,我们将返回到常规的 nano 编辑器屏幕。现在,保存文件后,只需按 Ctrl+X 快捷键退出 nano 编辑器。
- 一旦我们的 nano 编辑器关闭,我们将被带回原始命令行窗口。在这里,我们将看到消息 “crontab: installing new crontab”,这表示我们的 crontab 文件已成功保存。
消息将显示如下: - 现在,一旦我们完成此操作,每个用户帐户都将在每周的凌晨 5:00 进行备份。
cron 的常见用途cron 服务可用于安排许多显而易见的事情,例如每天凌晨 2:00 运行的定期备份。它也可用于不太显而易见的事情。cron 的一些主要用途如下: 许多计算机上的系统时间(操作系统时间)使用 NTP(网络时间协议)进行设置。NTP 可以设置系统时间,但系统时间可能会漂移,而 NTP 无法设置硬件时间。Cron 用于根据系统时间设置硬件时间。 还有一个可用的 Bash 程序,可以在所有计算机上创建一个新的“每日消息”(或 MOTD)。它包含诸如必须实时才能有用的磁盘使用情况等信息。各种系统服务和进程,如 RootKit Hunter、logrotate 和 Logwatch,都使用 cron 服务来每天运行程序和计划任务。 注意:crond 守护进程是一个后台服务,它激活了 cron 的功能。cron 服务会检查 /etc/anacrontab 文件以及 /etc/cron.d 和 /var/spool/cron 目录中的文件。这些文件的内容指定了将在不同时间间隔执行的 cron 作业。用户 cron 的单个文件位于 /var/spool/cron 目录内,系统应用程序和服务通常会将 cron 作业文件添加到 /etc/cron.d 目录中。 调度技巧有时 crontab 文件看起来相当随意。Cron 作业调度可能会很困难,尤其是当作业数量增加时。crond 服务认为主机系统会一直运行。这意味着,如果在 cron 作业设置为执行的时间系统关闭了,它们将不会执行,直到它们被安排执行的时间。如果它们是要求高的 cron 作业,这可能会导致问题。幸运的是,还有一个选项可以按常规间隔运行作业,即 anacron。 Crontab 选项下面列出了一些重要的 crontab 选项 - 我们可以使用 -e 选项来安装和更新 crontab 中的作业。
- 我们可以使用 -l 选项来列出 crontab 条目。
- 我们可以使用 -r 选项来卸载 crontab 中的作业。
- 我们可以使用 -i 选项来确认 crontab 中的作业卸载。
- 我们可以使用 -s 选项来为 crontab 文件添加 SELINUX 安全。
- 我们可以使用 -u 选项并指定用户名来编辑其他用户的 crontab。
- 我们可以使用以下选项来列出其他用户的 crontab 条目。
示例下面将讨论一些 Crontab 的示例: - 每天 12:59 执行 /usr/bin/sample.sh 并抑制结果
- 每天晚上 9 点(21:00)执行 sample.sh
- 每周二至周六凌晨 1 点(01:00)执行 sample.sh
- 在 07:00、9:30、13:30 和 15:30 执行 sample.sh
- 每天两次(下午 5 点和早上 5 点)执行 sample.sh
|