在 Linux 中使用 at 和 cron 调度任务

CompTIABeginner
立即练习

介绍

在本实验中,你将学习 Linux 环境下任务调度的基础知识。你将探索两个核心的命令行工具:at 用于调度在未来特定时间运行的一次性作业;cron 用于自动化处理需要定期执行(如每天、每周或每月)的重复性任务。

你将从准备实验环境开始,确保 atcron 服务已安装并处于激活状态。接着,你将练习使用 at 命令创建一次性作业,并使用 atqatrm 管理作业队列。最后,你将使用 crontab 命令创建、验证和删除周期性的 cron 作业,为你提供自动化系统管理任务的实战经验。

这是一个引导式实验,提供了逐步指导来帮助你学习和练习。请仔细按照说明完成每个步骤以获得实践经验。历史数据表明,这是一个 初学者 级别的实验,完成率为 95%。它在学习者中获得了 99% 的好评率。

准备实验环境

在这一步中,你将通过安装必要的工具来准备实验环境,以便在 Linux 中调度任务。我们将使用的两个主要工具是用于一次性任务的 at 和用于周期性任务的 cron。虽然 cron 通常在大多数 Linux 系统中预装,但 at 工具可能需要手动安装。

首先,让我们更新软件包列表,以确保我们可以获取最新版本的软件。

sudo apt-get update

当软件包列表从仓库下载时,你会看到相关的输出信息。

接下来,使用 apt-get 命令安装 at 软件包。-y 标志会自动确认安装,因此系统不会提示你进行确认。

sudo apt-get install -y at

输出将显示安装进度。安装完成后,at 命令即可在你的系统上使用。

at 命令依赖于一个名为 atd 的后台服务(守护进程)来执行调度的作业。我们需要确保该服务正在运行。你可以使用 systemctl 命令检查其状态。

sudo systemctl status atd

输出应显示该服务为 active (running)

● atd.service - Deferred execution scheduler
     Loaded: loaded (/lib/systemd/system/atd.service; enabled; vendor preset: enabled)
     Active: active (running) since <date_time>; <time_ago>
       Docs: man:atd(8)
   Main PID: <pid> (atd)
      Tasks: 1 (limit: 4622)
     Memory: 248.0K
        CPU: 11ms
     CGroup: /system.slice/atd.service
             └─<pid> /usr/sbin/atd -f

如果服务未激活,你可以使用以下命令启动它:

sudo systemctl start atd

最后,让我们验证 cron 服务是否也处于激活状态,因为我们将在后面的步骤中使用它。

sudo systemctl status cron

输出也应显示 active (running),确认 cron 守护进程已准备好处理调度任务。

● cron.service - Regular background program processing daemon
     Loaded: loaded (/lib/systemd/system/cron.service; enabled; vendor preset: enabled)
     Active: active (running) since <date_time>; <time_ago>
       Docs: man:cron(8)
   Main PID: <pid> (cron)
      Tasks: 1 (limit: 4622)
     Memory: 1.1M
        CPU: 40ms
     CGroup: /system.slice/cron.service
             └─<pid> /usr/sbin/cron -f

随着 atdcron 服务都在运行,你的环境现在已经为调度进程做好了充分准备。

使用 at 命令调度一次性作业

在这一步中,你将学习如何使用 at 命令调度一个在未来时间仅执行一次的任务。这对于运行那些不需要立即执行、也不需要定期重复的脚本或命令非常有用。at 命令从标准输入读取一系列命令,并将它们汇总为一个「at 作业」,在指定的时间执行。

让我们调度一个简单的命令,在当前项目目录(~/project)中创建一个名为 at_output.txt 的文件。我们将其设置为从现在起一分钟后运行。

首先,调用 at 命令并指定所需的时间。

at now + 1 minute

按下回车键后,你的终端提示符将变为 at>。这表示 at 正在等待你输入想要调度的命令。现在,输入创建文件并写入文本的命令。

echo "The at job executed successfully." > ~/project/at_output.txt

输入命令后按下回车键。要完成作业创建并退出 at> 提示符,请按 Ctrl-D(按住 Ctrl 键并按下 D)。你会看到一条确认消息,说明作业已调度,并显示其作业编号和执行时间。

warning: commands will be executed using /bin/sh
job 1 at Mon Jan 1 12:01:00 2024

现在,你需要等待一分钟让调度的作业运行。

一分钟过去后,你可以通过检查 at_output.txt 文件是否存在来验证作业是否已执行。使用 ls -l 命令查看文件的详细信息。

ls -l ~/project/at_output.txt

如果作业运行成功,文件将显示在输出中。

-rw-r--r-- 1 labex labex 35 Jan  1 12:01 /home/labex/project/at_output.txt

接下来,使用 cat 命令查看文件内容,确保 echo 命令按预期工作。

cat ~/project/at_output.txt

你应该在终端中看到以下输出:

The at job executed successfully.

最后,为了保持项目目录整洁以进行后续步骤,请删除刚刚创建的文件。

rm ~/project/at_output.txt

你现在已经成功使用 at 命令调度、验证并清理了一个一次性作业。

使用 atq 和 atrm 管理待处理作业

在这一步中,你将学习如何查看和取消已调度的 at 作业。调度了一个任务后,发现不再需要它或需要对其进行修改是很常见的情况。atq 命令允许你查看待处理作业的队列,而 atrm 命令则允许你删除它们。

首先,让我们调度一个足够遥远的未来作业,以便我们有时间对其进行管理。我们将调度一个在 10 分钟后运行的命令。

at now + 10 minutes

at> 提示符下,输入一个创建文件的命令。我们将文件命名为 temporary_job.txt

touch ~/project/temporary_job.txt

按下回车键,然后按 Ctrl-D 保存作业。系统将确认作业已创建并显示其作业编号。请记下这个作业编号,因为稍后删除作业时会用到它。

warning: commands will be executed using /bin/sh
job 2 at Mon Jan 1 12:10:00 2024

(注意:你的作业编号和时间会有所不同。)

现在,要查看所有待处理作业的列表,请使用 atq(at queue)命令。

atq

输出将列出你调度的作业,显示其作业编号、预定运行日期和时间、所在的队列(a)以及调度该作业的用户。

2 Mon Jan 1 12:10:00 2024 a labex

假设你决定不再运行此作业。你可以使用 atrm(at remove)命令取消它,后面跟上你之前记下的作业编号。

将下面命令中的 <job_number> 替换为你实际的作业编号。例如,如果你的作业编号是 2,则运行 atrm 2

atrm <job_number>

如果成功删除了作业,该命令不会产生任何输出。

要验证作业是否已从队列中移除,请再次运行 atq

atq

这一次,命令应该没有任何输出。这种静默状态确认了你的 at 作业队列已空,且 temporary_job.txt 文件将不会被创建。

使用 crontab -e 创建周期性作业

在这一步中,你将学习如何使用 cron 调度周期性任务。与只运行一次作业的 at 不同,cron 旨在按计划重复运行作业。你将在一个名为 crontab 的特殊文件中管理你的调度作业。

要编辑用户的 crontab 文件,可以使用 crontab -e 命令。其中 -e 代表「编辑」(edit)。

让我们打开 crontab 文件进行编辑。

crontab -e

如果这是你第一次运行 crontab -e,系统可能会提示你选择默认的文本编辑器。我们建议选择 nano,因为它非常易于使用。

Select an editor. To change later, run 'select-editor'.
  1. /bin/nano        <---- 最简单
  2. /usr/bin/vim.basic
  ...

Choose 1-2 [1]:

输入 1 然后按回车键选择 nanocrontab 文件将打开。除了几行解释如何使用它的注释外,文件内容基本是空的。

crontab 条目具有特定的格式,包含六个字段:
分钟 小时 日 月 星期 命令

时间字段中的星号(*)充当通配符,表示「每」。对于我们的任务,我们希望每分钟运行一次命令。这非常适合测试,因为我们不需要等待太久就能看到结果。「每分钟」的调度配置是 * * * * *

现在,在文件末尾添加一行新内容,调度一个将当前日期和时间追加到项目目录中名为 cron_log.txt 的日志文件的作业。

* * * * * date >> ~/project/cron_log.txt

添加该行后,你的编辑器内容应该如下所示:

## Edit this file to introduce tasks to be run by cron.
#
## Each task to run has to be defined through a single line
## indicating with different fields when the task will be run
## and what command to run for the task
#
## To define the time you can provide concrete values for
## minute (m), hour (h), day of month (dom), month (mon),
## and day of week (dow) or use '*' in these fields (for 'any').
#
## Notice that tasks will be started based on the cron's system
## daemon's notion of time and timezones.
#
## Output of the crontab jobs (including errors) is sent through
## email to the user the crontab file belongs to (unless redirected).
#
## For example, you can run a backup of all your user accounts
## at 5 a.m. every week with:
## 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
#
## For more information see the manual pages of crontab(5) and cron(8)
#
## m h  dom mon dow   command
* * * * * date >> ~/project/cron_log.txt

要保存文件并退出 nano,请按 Ctrl-X,然后按 Y 确认更改,最后按回车键写入文件。

退出后,你会在终端看到一条确认消息:

crontab: installing new crontab

这意味着你的新 cron 作业已激活。cron 守护进程现在将每分钟检查一次此文件并执行你的命令。

等待至少一分钟。然后,验证日志文件是否已创建。

ls -l ~/project/cron_log.txt

你应该能看到列出的文件。

-rw-r--r-- 1 labex labex 29 Jan  1 12:15 /home/labex/project/cron_log.txt

现在,查看其内容。

cat ~/project/cron_log.txt

输出将显示命令第一次执行时的日期和时间。

Mon Jan  1 12:15:01 UTC 2024

如果你再等一分钟并再次运行 cat 命令,你会看到带有更新时间戳的新行,这证明作业正在重复运行。

使用 crontab -l 和 -r 验证并删除 Cron 作业

在最后一步中,你将学习如何在不打开编辑器的情况下查看已调度的 cron 作业,以及如何彻底删除它们。这些是保持系统调度任务井然有序且整洁的基本管理操作。

首先,让我们列出当前激活的 cron 作业。crontab -l 命令(其中 -l 代表「列表」)会直接在终端显示你的 crontab 文件内容。

crontab -l

输出将显示你在上一步中创建的作业。

## Edit this file to introduce tasks to be run by cron.
## ... (其他注释) ...
## m h  dom mon dow   command
* * * * * date >> ~/project/cron_log.txt

此命令是一种安全的只读方式,用于检查已调度的作业。

现在,假设你不再需要这个周期性作业。要删除它,可以使用 crontab -r 命令(其中 -r 代表「移除」)。使用此命令时要非常小心,因为它会直接删除当前用户的整个 crontab 文件,而不会询问确认。

执行删除 crontab 的命令。

crontab -r

如果执行成功,该命令不会产生任何输出。

要验证你的 crontab 是否已被删除,请再次运行列表命令。

crontab -l

这一次,命令将返回一条错误消息,指出你不再拥有 crontab 文件。

no crontab for labex

这确认了你的调度作业已成功移除,不再运行。

最后,为了完成实验并清理工作区,请删除由 cron 作业创建的 cron_log.txt 文件。

rm ~/project/cron_log.txt

你现在已经成功列出、删除并验证了 cron 作业的移除,完成了完整的管理生命周期。

总结

在本实验中,你学习了如何通过安装 at 软件包并验证 atdcron 服务是否激活来准备 Linux 任务调度环境。你练习了使用 at 命令调度未来执行的一次性作业。你还学习了如何通过使用 atq 查看队列和使用 atrm 删除特定作业来管理这些待处理任务。

此外,你还探索了如何使用 cron 调度周期性任务。你使用了 crontab -e 命令编辑用户的 crontab 文件并添加了新的自动化作业。最后,你学习了如何使用 crontab -l 验证当前调度的 cron 作业列表,以及如何使用 crontab -r 命令删除用户所有的调度 cron 作业。