标签 cron 下的文章

通过使用这个简单而强大的 Linux 命令行工具,来安排备份、文件清理以及其他任务。

 title=

在计算机上让任务按照有规律并且可预测的时间表运行很重要。作为人类,我们有时会因为分心、脑子里想太多,或是度假而记不住要做的事情。计算机真的很擅长按计划做事,但在计算机采取行动之前,人类必须对计算机进行编程。

在某种程度上,cron 系统是编程的初级简单入门。通过编辑一个文件就可以让计算机做你想让它做的事。你甚至不需要知道文件保存在哪里。只需键入一个简单的命令,输入你希望电脑遵循的 “配方”,并保存。从那时起,计算机会在指定时间执行你的指令,直到被告知停止。

从设计上来看,cron 不是一个复杂的系统。这里有一些你需要了解的内容。

cron 是什么?

cron 命令在 Linux 和 Unix 中无处不在,而且它经常被模仿和重塑,以至于它几乎成了按计划发生的事情的一个通用术语。它是自动化的一种形式,尽管有不同的实现方式(比如 Dillon's cron、Vixie's cron、chrony 和其他),以及像 anacron 和 systemd 定时器这样的变化,但其语法和工作流程几十年来一直保持着基本一致。

cron 在一个 “ 假脱机 spool ” 系统上工作,像打印机和电子邮件一样。如果不你知道打印机和电子邮件使用假脱机也没关系,因为假脱机文件的意义在于,你不需要想太多。在 Linux 系统中,/var/spool 目录被设计为重要但低级的文件的中心枢纽,用户不需要直接与之交互。 在 /var/spool 中管理的一个假脱机是 cron 表(简称为 “crontab”)。 包括你在内的每个用户在 Linux 系统中都有一个 crontab。用户可以编辑、查看和删除自己的 crontab。除此之外,用户可以使用 crontab 来安排任务。cron 系统监控 crontab,并确保一个 crontab 中列出的任何工作都能在其指定时间执行。

编辑 cron 设置

你可以使用 crontab 命令和 -e(代表“编辑”)选项来编辑你的 crontab。默认情况下,大多数系统会调用 vim 文本编辑器。如果你和我一样,不使用 Vim,那么你可以在 ~/.bashrc 文件中为自己设置一个不同的编辑器。我把我的设置为 Emacs,但你也可以试试 NanoKate,或者任何你喜欢的编辑器。EDITOR 环境变量定义了你在终端使用的文本编辑器,而 VISUAL 变量定义了你在图形模式下使用的编辑器:

export EDITOR=nano
export VISUAL=kate

更新设置后刷新你的 shell 会话:

$ source ~/.bashrc

现在你可以用喜欢的编辑器编辑 crontab:

$ crontab -e

为任务执行安排时间

cron 系统本质上是一个日历系统。可以通过五个不同的属性告诉 cron 需要让一个任务多长时间运行一次:分、时、日、月、星期。这些属性的顺序是固定的,并且不一定是直观的,你可以把它们看作是过滤器或掩码。默认情况下,你可以理解为所有东西都被设置为“总是”或者“每一个”。此命令将在全年的每一天每小时每分钟运行 touch /tmp/hello

* * * * * touch /tmp/hello

可以通过设置每个属性的具体定义来限制这个包罗万象的时间安排表。使任务在每个小时的 30 分钟时运行,将分钟设置为 30

30 * * * * touch /tmp/hello

可以通过一个具体的小时来进一步约束这个指令。使任务在每个凌晨 3:30 运行:

30 3 * * * touch /tmp/hello

你也可以让这个任务只在每个月的第一天运行:

30 3 1 * * touch /tmp/hello

你可以用 112 表示 1 至 12 月来设置月份,用 06 表示周日至周六来设置星期。这项任务在 4 月份的周一的 3:15 运行:

15 3 * 4 1 touch /tmp/hello

设置增量

所有这些设置都与一个固定时间 完全 匹配。使用 cron 符号设置可以在特定时间段后运行任务,例如,每 15 分钟运行一个任务:

*/15 * * * * touch /tmp/hello

每三天在上午 10 点运行任务:

* 10 */3 * * touch /tmp/hello

每 6 小时运行一次任务:

* */6 * * * touch /tmp/hello

Cron 速记符

现代的 cron 实现已经为常见的时间安排表添加了方便的速记符,包括:

  • @hourly:每小时
  • @daily:每天
  • @weekly:每周
  • @monthly:每月
  • @yearly@annually:每年

列出 cron 任务

使用 crontab 命令,查看计划中的 cron 任务列表:

$ crontab -l
15 3 * 4 1 touch /tmp/hello

删除一个 crontab

当一个 crontab 任务不需要时,可以使用 -r 选项来删除它:

$ crontab -r -i

-i 选项代表 交互式。它在删除文件之前会提示你进行确认。

Cron 可以做什么

知道如何使用 cron 是一回事,但但知道它的用途是另一回事。经典用例就是备份计划。如果你的电脑一天中大部分时间都是开着的,或者整天整夜地开着,那么可以为重要分区进行例行备份。我会在每天凌晨 3 点在主要数据分区上运行一个名为 rdiff-backup 的备份程序:

$ crontab -l | grep rdiff
* 3 * * * rdiff-backup /data/ /vault/

另一个常见的用途是系统维护。在我的 Slackware 桌面上,每周五下午会更新本地版本库目录:

$ crontab -l | grep slack
* 14 * * 5 sudo slackpkg update

我还会每 3 天在 15:00 运行一个 Ansible 脚本来 清理我的下载文件夹

$ crontab -l | grep ansible
* 15 */3 * * ansible-playbook /home/seth/Ansible/cleanup.yaml

有一些重复数据删除脚本、文件大小和 /tmp 目录的监视器、照片调整器、文件移动工具以及很多琐碎的任务,你可以安排在后台运行,以帮助保持系统不受干扰。有了 cron,计算机可以以我希望我的实体公寓能够做到的方式来照顾自己。

记住 cron 的设置

除了想明白你为什么需要 cron 之外,根据我的经验,cron 最难的事情是记住它的语法。重复这句话给自己听,反反复复,直到你记牢它:

分、时、日、月、星

分、时、日、月、星

分、时、日、月、星

更好的做法是,去 下载我们免费的速查表 ,这样当你最需要它时,它触手可及!

Cron 速查表

via: https://opensource.com/article/21/11/cron-linux

作者:Seth Kenlon 选题:lujun9972 译者:Veryzzj 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

在本期的《Linux 黑话解释》系列文章中,你将了解到 Linux 中的 定时任务 cron job 功能。你将通过学习编辑 crontab 文件来创建定时任务。

何为定时任务

cron 是一个用于按计划运行短小且快速的命令的实用命令行工具。该工具是一个方便、经典的系统管理工具,通过和其他工具结合使用可以自动运行各式各样的任务。比如,有些人通过把 rsynccron 结合使用,在特定的时间自动创建每日备份和每周备份。也有些人使用 cron 来分析服务器日志,并且结合邮件系统功能,在日志检测到错误时自动发送告警邮件。

cron 就如同“瑞士军刀”一样,可以多场景多样化使用。尽可能发挥你的想象,去挖掘它的功能。

其实 cron 的使用很容易上手,只需要几秒钟。不过在我们开始上手之前,先来讨论下几个经常容易混淆的概念。

cron、定时任务、crontab

有三个术语比较容易混淆:cron、定时任务和 crontab,让我们来看看它们的含义:

术语含义
cron这是安装在系统上的实际执行定时任务的 守护进程
定时任务“任务”是指一段启动并运行的程序。cron 可以按照约定的时间计划运行各种任务,这样的任务通常叫做“定时任务”。
crontab这是一个文件,用于定义定时任务。一个 crontab 文件可以通过表格形式(每一行就是一个定时任务)定义多个定时任务。

来看一个简单例子:创建一个定时任务,每小时向 crontabl_log.txt 文件打印 Linux is cool!

0 * * * *  echo "Linux is Cool!" >> ~/crontab_log.txt

是不是这么个简单定时任务的例子都让你感到惊恐,这是因为你需要懂得如何去读懂一个定时任务的属性。

我将在后文中讲述这个基础理论知识。

上手 cron

我们通过另一个例子来看看 cron 如何工作。

为了创建定时任务(或者说 cron 将要执行的命令任务),你只需要运行:

crontab -e

这将会打开一个文件,用于编辑定时任务:

Crontab default view

其中,所有以 # 开头的行都是注释,用于指导你如何使用 cron,如果觉得没用可以删除它们。

我们将创建如下任务,作为我们的第一个定时任务:

* * * * * touch ~/crontab_test

让我快速看看该任务将会做什么:

定时任务都是以 “分钟 小时 天 月 周 命令” 形式呈现:

  • 分钟:指该任务在哪一分钟会被执行。所以,该值为 0 则代表在每个小时开始时运行,5 则代表在每个小时的第 5 分钟会运行。
  • 小时:指该任务在一天中的哪个小时会被执行,取值范围为 0-23。没有 24 的原因是 23 时的末尾是半夜 11:59,然后就是每天的开始 0 时。分钟的取值范围定义逻辑与之类似。
  • 天:指一个月中的哪一天执行该任务,取值范围是 1-31(不同于前面的分钟和小时从 0 开始取值)。
  • 月:指该任务在哪个月被执行,取值范围是 1-12
  • 周:指该任务在星期几被执行,从周日开始算起,取值范围是 0-6(分别对应周日、周一到周六)。
  • 命令:是你想要运行的命令任务。

如果想对 “分钟 小时 天 月 周” 部分有更详细的理解,可以参考 Crontab guru 网站,该网站可以帮助你理解正在执行什么。

接着之前的例子 * * * * * touch ~/crontab_test,表示每分钟创建一次 ~/crontab_test 文件。

让我们将该任务编辑进 crontab 然后看看执行结果:

等到下一分钟,你就会发现你的家目录下多了文件 crontab_test:

这便是 cron 的基础应用示例。

一个实用的定时任务示例

假设你想创建一个脚本,用于拷贝多个目录内容到一个路径并打包作为备份,该如何实现?

通过 cron 定时任务就可以很容易实现该功能。

请看如下脚本:

#!/usr/bin/bash
echo "Backing up..."
mkdir -p ~/.local/tmp/
tar -Pc ~/Documents/ -f ~/.local/tmp/backup.gz

该脚本做了如下事情:

  1. 确保备份路径目录 ~/.local/tmp/ 存在。
  2. 将目录 ~/Documents/ 下的所有内容打包至文件 ~/.local/tmp/backup.gz

我们先来手动运行该脚本,看看它到底如何工作。

首先,我们在家目录(~)下创建该脚本,命令为 backup_script,如下图所示:

然后编辑 backup_script 脚本,写入上面那个脚本代码。

接着,赋予 backup_script 可执行权限:

最后运行脚本 ~/backup_script,进行功能验证:

你可以通过运行命令 tar -xf ~/.local/tmp/backup.gz -C <output_dir> 来进行备份恢复,这里 <output_dir> 是指文件要恢复到的路径目录。

接下来,就可以用 cron 工具来进行定时任务运行该脚本了。

举个例子,假设需要每天的凌晨 3 点运行该备份脚本,你可以在 crontab 中输入如下命令:

* 3 * * * ~/backup_script

这样你就可以每天自动进行备份操作了。

后记

本文简单介绍了定时任务功能。尽管我不确定 Linux 桌面用户使用该功能多不多,但我知道定时任务功能被许多系统管理员广泛应用。如果你有什么想法,欢迎在评论区留言。


via: https://itsfoss.com/cron-job/

作者:Hunter Wittenborn 选题:lujun9972 译者:jrglinux 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

在 Linux 系统中有一些其他开源项目可以结合或者替代 cron 系统使用。

 title=

Linux cron 系统 是一项经过时间检验的成熟技术,然而在任何情况下它都是最合适的系统自动化工具吗?答案是否定的。有一些开源项目就可以用来与 cron 结合或者直接代替 cron 使用。

at 命令

cron 适用于长期重复任务。如果你设置了一个工作任务,它会从现在开始定期运行,直到计算机报废为止。但有些情况下你可能只想设置一个一次性命令,以备不在计算机旁时该命令可以自动运行。这时你可以选择使用 at 命令。

at 的语法比 cron 语法简单和灵活得多,并且兼具交互式和非交互式调度方法。(只要你想,你甚至可以使用 at 作业创建一个 at 作业。)

$ echo "rsync -av /home/tux/ me@myserver:/home/tux/" | at 1:30 AM

该命令语法自然且易用,并且不需要用户清理旧作业,因为它们一旦运行后就完全被计算机遗忘了。

阅读有关 at 命令 的更多信息并开始使用吧。

systemd

除了管理计算机上的进程外,systemd 还可以帮你调度这些进程。与传统的 cron 作业一样,systemd 计时器可以在指定的时间间隔触发事件,例如 shell 脚本和命令。时间间隔可以是每月特定日期的一天一次(例如在星期一的时候触发),或者在 09:00 到 17:00 的工作时间内每 15 分钟一次。

此外 systemd 里的计时器还可以做一些 cron 作业不能做的事情。

例如,计时器可以在一个事件 之后 触发脚本或程序来运行特定时长,这个事件可以是开机,可以是前置任务的完成,甚至可以是计时器本身调用的服务单元的完成!

如果你的系统运行着 systemd 服务,那么你的机器就已经在技术层面上使用 systemd 计时器了。默认计时器会执行一些琐碎的任务,例如滚动日志文件、更新 mlocate 数据库、管理 DNF 数据库等。创建自己的计时器很容易,具体可以参阅 David Both 的文章 使用 systemd 计时器来代替 cron

anacron 命令

cron 专门用于在特定时间运行命令,这适用于从不休眠或断电的服务器。然而对笔记本电脑和台式工作站而言,时常有意或无意地关机是很常见的。当计算机处于关机状态时,cron 不会运行,因此设定在这段时间内的一些重要工作(例如备份数据)也就会跳过执行。

anacron 系统旨在确保作业定期运行,而不是按计划时间点运行。这就意味着你可以将计算机关机几天,再次启动时仍然靠 anacron 来运行基本任务。anacron 与 cron 协同工作,因此严格来说前者不是后者的替代品,而是一种调度任务的有效可选方案。许多系统管理员配置了一个 cron 作业来在深夜备份远程工作者计算机上的数据,结果却发现该作业在过去六个月中只运行过一次。anacron 确保重要的工作在 可执行的时候 发生,而不是必须在安排好的 特定时间点 发生。

点击参阅关于 使用 anacron 获得更好的 crontab 效果 的更多内容。

自动化

计算机和技术旨在让人们的生活更美好,工作更轻松。Linux 为用户提供了许多有用的功能,以确保完成重要的操作系统任务。查看这些可用的功能,然后试着将这些功能用于你自己的工作任务吧。(LCTT 译注:作者本段有些语焉不详,读者可参阅譬如 Ansible 自动化工具安装、配置和快速入门指南 等关于 Linux 自动化的文章)


via: https://opensource.com/article/21/7/alternatives-cron-linux

作者:Seth Kenlon 选题:lujun9972 译者:unigeorge 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

cron 定时器是一个可以按照计划自动运行命令的工具。

 title=

cron 定时器是一个可以按照计划自动运行命令的工具。定时器作业称为 cronjob,创建于 crontab 文件中。这是用户自动操作电脑的最简单也是最古老的方法。

创建一个 cronjob

要创建一个 cronjob,你可以使用 crontab 命令,并添加 -e 选项:

$ crontab -e

这将使用默认的文本编辑器打开 crontab。如需指定文本编辑器,请使用 EDITOR 环境变量

$ EDITOR=nano crontab -e

Cron 语法

如需调度一个 cronjob,你需要提供给计算机你想要执行的命令,然后提供一个 cron 表达式。cron 表达式在命令调度时运行:

  • 分钟(0 到 59)
  • 小时(0 到 23, 0 代表午夜执行)
  • 日期(1 到 31)
  • 月份(1 到 12)
  • 星期(0 到 6, 星期天是 0)

星号 (*) 代表的是“每一个”。例如,下面的表达式在每月每日每小时的 0 分钟运行备份脚本:

/opt/backup.sh 0 * * * *

下面的表达式在周日的凌晨 3:30 运行备份脚本:

/opt/backup.sh 30 3 * * 0

简写语法

现代的 cron 支持简化的宏,而不是 cron 表达式:

  • @hourly 在每天的每小时的 0 分运行
  • @daily 在每天的 0 时 0 分运行
  • @weekly 在周日的 0 时 0 分运行
  • @monthly 在每月的第一天的 0 时 0 分运行

例如,下面的 crontab 命令在每天的 0 时运行备份脚本:

/opt/backup.sh @daily

如何停止一个 cronjob

一旦你开始了一个 cronjob,它就会永远按照计划运行。想要在启动后停止 cronjob,你必须编辑 crontab,删除触发该作业的命令行,然后保存文件。

$ EDITOR=nano crontab -e

如需停止一个正在运行的作业,可以 使用标准的 Linux 进程命令 来停止一个正在运行的进程。

它是自动的

一旦你编写完 crontab,保存了文件并且退出了编辑器。你的 cronjob 就已经被调度了,剩下的工作都交给 cron 完成。


via: https://opensource.com/article/21/7/cron-linux

作者:Seth Kenlon 选题:lujun9972 译者:perfiffer 校对:turbokernel

本文由 LCTT 原创编译,Linux中国 荣誉推出

systemd 提供定时器有一段时间了,定时器替代了 cron 功能,这一特性值得看看。本文将向你介绍在系统启动后如何使用 systemd 中的定时器来运行任务,并在此后重复运行。这不是对 systemd 的全面讨论,只是对此特性的一个介绍。

快速回顾:cron、anacron 与 systemd

cron 可以以几分钟到几个月或更长时间的粒度调度运行一个任务。设置起来相对简单,它只需要一个配置文件。虽然配置过程有些深奥,但一般用户也可以使用。

然而,如果你的系统在需要执行的时间没有运行,那么 cron 会失败。

anacron 克服了“系统没有运行”的问题。它确保任务将在你的系统再次启动时执行。虽然它旨在给管理员使用,但有些系统允许普通用户访问 anacron。

但是,anacron 的执行频率不能低于每天一次。

cron 和 anacron 都存在执行上下文一致性的问题。必须注意任务运行时有效的环境与测试时使用的环境完全相同。必须提供相同的 shell、环境变量和路径。这意味着测试和调试有时会很困难。

systemd 定时器提供了 cron 和 anacron 二者的优点,允许调度到分钟粒度。确保在系统再次运行时执行任务,即使在预期的执行时间内系统处于关闭状态。它对所有用户都可用。你可以在它将要运行的环境中测试和调试执行。

但是,它的配置更加复杂,至少需要两个配置文件。

如果你的 cron 和 anacron 配置可以很好地为你服务,那么可能没有理由改变。但是 systemd 至少值得研究,因为它可以简化任何当前的 cron/anacron 工作方式。

配置

systemd 定时器执行功能至少需要两个文件。这两个是“ 定时器单元 timer unit ”和“ 服务单元 service unit ”。(其执行的)“动作”不仅仅是简单的命令,你还需要一个“作业”文件或脚本来执行必要的功能。

定时器单元文件定义调度表,而服务单元文件定义执行的任务。有关的更多详细信息请参考 man systemd.timer 中提供的 .timer 单元。服务单元的详细信息可在 man systemd.service 中找到。

单元文件存放在几个位置(在手册页中有列出)。然而,对于普通用户来说,最容易找到的位置可能是 ~/.config/systemd/user。请注意,这里的 user 是字符串 user

示例

此示例是一个创建用户调度作业而不是(以 root 用户身份运行的)系统调度作业的简单示例。它将消息、日期和时间打印到文件中。

1、首先创建一个执行任务的 shell 脚本。在你的本地 bin 目录中创建它,例如在 ~/bin/schedule-test.sh 中。

创建文件:

touch ~/bin/schedule-test.sh

然后将以下内容添加到你刚刚创建的文件中:

#!/bin/sh
echo "This is only a test: $(date)" >> "$HOME/schedule-test-output.txt"

记住赋予你的 shell 脚本执行权限。

2、创建 .service 单元调用上面的脚本。在以下位置创建目录与文件:~/.config/systemd/user/schedule-test.service

[Unit]
Description=A job to test the systemd scheduler

[Service]
Type=simple
ExecStart=/home/<user>/bin/schedule-test.sh

[Install]
WantedBy=default.target

请注意 <user> 应该是你的家目录地址,但是单元文件路径名中的 user 实际上是字符串 user

ExecStart 应该提供一个没有变量的绝对地址。例外情况是,对于用户单元文件,你可以用 %h 替换 $HOME。换句话说,你可以使用:

ExecStart=%h/bin/schedule-test.sh

这仅用于用户单元文件,而不适用于系统服务,因为在系统环境中运行时 %h 总是返回 /root。其他特殊符号可在 man systemd.unitSPECIFIERS 中找到。因为它超出了本文的范围,所以这就是我们目前需要了解的关于特殊符号的全部内容。

3、创建一个 .timer 单元文件,该文件实际上调度你创建的 .service 单元文件。在 .service 单元文件相同位置创建它:~/.config/systemd/user/schedule-test.timer。请注意,文件名仅在扩展名上有所不同,例如一个是 .service,一个是 .timer

[Unit]
Description=Schedule a message every 1 minute
RefuseManualStart=no  # Allow manual starts
RefuseManualStop=no   # Allow manual stops

[Timer]
#Execute job if it missed a run due to machine being off
Persistent=true
#Run 120 seconds after boot for the first time
OnBootSec=120
#Run every 1 minute thereafter
OnUnitActiveSec=60
#File describing job to execute
Unit=schedule-test.service

[Install]
WantedBy=timers.target

请注意,这个 .timer 单元文件使用了 OnUnitActiveSec 来指定调度表。OnCalendar 选项更加灵活。例如:

# run on the minute of every minute every hour of every day
 OnCalendar=*-*-* *:*:00
# run on the hour of every hour of every day
 OnCalendar=*-*-* *:00:00
# run every day
 OnCalendar=*-*-* 00:00:00
# run 11:12:13 of the first or fifth day of any month of the year
# 2012, but only if that day is a Thursday or Friday
 OnCalendar=Thu,Fri 2012-*-1,5 11:12:13

有关 OnCalendar 的更多信息参见 这里

4、所有的部件都已就位,但你应该进行测试,以确保一切正常。首先,启用该用户服务:

$ systemctl --user enable schedule-test.service

这将导致类似如下的输出:

Created symlink /home/<user>/.config/systemd/user/default.target.wants/schedule-test.service → /home/<user>/.config/systemd/user/schedule-test.service.

现在执行测试工作:

$ systemctl --user start schedule-test.service

检查你的输出文件($HOME/schedule-test-output.txt),确保你的脚本运行正常。应该只有一个条目,因为我们还没有启动定时器。必要时进行调试。如果你需要更改 .service 单元文件,而不是更改它调用的 shell 脚本,请不要忘记再次启用该服务。

5、一旦作业正常运行,通过为服务启用、启动用户定时器来实时调度作业:

$ systemctl --user enable schedule-test.timer
$ systemctl --user start schedule-test.timer

请注意,你已经在上面的步骤 4 中启动、启用了服务,因此只需要为它启用、启动定时器。

enable 命令会产生如下输出:

Created symlink /home/<user>/.config/systemd/user/timers.target.wants/schedule-test.timer → /home/<user>/.config/systemd/user/schedule-test.timer.

start 命令将只是返回命令行界面提示符。

其他操作

你可以检查和监控服务。如果你从系统服务收到错误,下面的第一个命令特别有用:

$ systemctl --user status schedule-test
$ systemctl --user list-unit-files

手动停止服务:

$ systemctl --user stop schedule-test.service

永久停止并禁用定时器和服务,重新加载守护程序配置并重置任何失败通知:

$ systemctl --user stop schedule-test.timer
$ systemctl --user disable schedule-test.timer
$ systemctl --user stop schedule-test.service
$ systemctl --user disable schedule-test.service
$ systemctl --user daemon-reload
$ systemctl --user reset-failed

总结

本文以 systemd 定时器为出发点,但是 systemd 的内容远不止于此。这篇文章应该为你提供一个基础。你可以从 Fedora Magazine systemd 系列 开始探索更多。

参考

更多阅读:


via: https://fedoramagazine.org/systemd-timers-for-scheduling-tasks/

作者:Richard England 选题:lujun9972 译者:dcoliversun 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

cron 是一个调度守护进程,它以指定的时间间隔执行任务,这些任务称为 corn 作业,主要用于自动执行系统维护或管理任务。例如,你可以设置一个 cron 作业来自动执行重复的任务,比如备份数据库或数据,使用最新的安全补丁更新系统,检查磁盘空间使用情况,发送电子邮件等等。 cron 作业可以按分钟、小时、日、月、星期或它们的任意组合运行。

cron 的一些优点

以下是使用 cron 作业的一些优点:

  • 你可以更好地控制作业的运行时间。例如,你可以精确到分钟、小时、天等。
  • 它消除了为循环任务逻辑而去写代码的需要,当你不再需要执行任务时,可以直接关闭它。
  • 作业在不执行时不会占用内存,因此你可以节省内存分配。
  • 如果一个作业执行失败并由于某种原因退出,它将在适当的时间再次运行。

安装 cron 守护进程

幸运的是,Fedora Linux 预先配置了运行重要的系统任务来保持系统更新,有几个实用程序可以运行任务例如 cron、anacronatbatch 。本文只关注 cron 实用程序的安装。cron 和 cronie 包一起安装,cronie 包也提供 cron 服务。

要确定软件包是否已经存在,使用 rpm 命令:

$ rpm -q cronie
 Cronie-1.5.2-4.el8.x86_64

如果安装了 cronie ,它将返回 cronie 包的全名。如果你的系统中没有安装,则会显示未安装。

使用以下命令安装:

$ dnf install cronie

运行 cron 守护进程

cron 作业由 crond 服务来执行,它会读取配置文件中的信息。在将作业添加到配置文件之前,必须启动 crond 服务,或者安装它。什么是 crond 呢?crond 是 cron 守护程序的简称。要确定 crond 服务是否正在运行,输入以下命令:

$ systemctl status crond.service
● crond.service - Command Scheduler
      Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor pre>
      Active: active (running) since Sat 2021-03-20 14:12:35 PDT; 1 day 21h ago
    Main PID: 1110 (crond)

如果你没有看到类似的内容 Active: active (running) since…,你需要启动 crond 守护进程。要在当前会话中运行 crond 服务,输入以下命令:

$ systemctl run crond.service

将其配置为开机自启动,输入以下命令:

$ systemctl enable crond.service

如果出于某种原因,你希望停止 crond 服务,按以下方式使用 stop 命令:

$ systemctl stop crond.service

要重新启动它,只需使用 restart 命令:

$ systemctl restart crond.service

定义一个 cron 作业

cron 配置

以下是一个 cron 作业的配置细节示例。它定义了一个简单的 cron 作业,将 git master 分支的最新更改拉取到克隆的仓库中:

*/59 * * * * username cd /home/username/project/design && git pull origin master

主要有两部分:

  • 第一部分是 */59 * * * *。这表明计时器设置为第 59 分钟执行一次。(LCTT 译注:原文此处有误。)
  • 该行的其余部分是命令,因为它将从命令行运行。 在此示例中,命令本身包含三个部分:

    • 作业将以用户 username 的身份运行
    • 它将切换到目录 /home/username/project/design
    • 运行 git 命令拉取 master 分支中的最新更改

时间语法

如上所述,时间信息是 cron 作业字符串的第一部分,如上所属。它决定了 cron 作业运行的频率和时间。它按以下顺序包括 5 个部分:

  • 分钟
  • 小时
  • 一个月中的某天
  • 月份
  • 一周中的某天

下面是一种更图形化的方式来解释语法:

  .--------------- 分钟 (0 - 59)
 |  .------------- 小时 (0 - 23)
 |  |  .---------- 一月中的某天 (1 - 31)
 |  |  |  .------- 月份 (1 - 12) 或 jan、feb、mar、apr …
 |  |  |  |  .---- 一周中的某天 (0-6) (周日=0 或 7)
 |  |  |  |  |            或 sun、mon、tue、wed、thr、fri、sat
 |  |  |  |  |               
 *  *  *  *  *  user-name  command-to-be-executed 

星号的使用

星号(*)可以用来替代数字,表示该位置的所有可能值。例如,分钟位置上的星号会使它每分钟运行一次。以下示例可能有助于更好地理解语法。

这个 cron 作业将每分钟运行一次:

* * * * [command]

斜杠表示分钟的间隔数。下面的示例将每小时运行 12 次,即每 5 分钟运行一次:

*/5 * * * * [command]

下一个示例将每月的第二天午夜(例如 1 月 2 日凌晨 12:00,2 月 2 日凌晨 12:00 等等):

0 0 2 * * [command]

(LCTT 译注:关于 cron 时间格式,还有更多格式符号,此处没有展开)

使用 crontab 创建一个 cron 作业

cron 作业会在后台运行,它会不断检查 /etc/crontab 文件和 /etc/cron.*/ 以及 /var/spool/cron/ 目录。每个用户在 /var/spool/cron/ 中都有一个唯一的 crontab 文件。

不应该直接编辑这些 cron 文件。crontab 命令是用于创建、编辑、安装、卸载和列出 cron 作业的方法。

更酷的是,在创建新文件或编辑现有文件后,你无需重新启动 cron。

$ crontab -e

这将打开你现有的 crontab 文件,或者创建一个。调用 crontab -e 时,默认情况下会使用 vi 编辑器。注意:要使用 Nano 编辑 crontab 文件,可以设置 EDITOR=nano 环境变量。

使用 -l 选项列出所有 cron 作业。如果需要,使用 -u 选项指定一个用户。

$ crontab -l
$ crontab -u username -l

使用以下命令删除所有 cron 作业:

$ crontab -r

要删除特定用户的作业,你必须以 root 用户身份运行以下命令:

$ crontab -r -u username

感谢你的阅读。cron 作业看起来可能只是系统管理员的工具,但它实际上与许多 Web 应用程序和用户任务有关。

参考

Fedora Linux 文档的 自动化任务


via: https://fedoramagazine.org/scheduling-tasks-with-cron/

作者:Darshna Das 选题:lujun9972 译者:MjSeven 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出