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

CompTIACompTIABeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

引言

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

你将首先准备你的实验环境,确保 atcron 服务已安装并处于活动状态。然后,你将练习使用 at 命令创建一次性任务,并使用 atqatrm 管理任务队列。最后,你将使用 crontab 命令创建、验证和移除一个重复性的 cron 任务,从而获得自动化系统管理任务的实践经验。

准备实验环境

在此步骤中,你将通过安装 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-job”中,该作业将在指定的时间执行。

让我们安排一个简单的命令,该命令将在你当前的工程目录(~/project)中创建一个名为 at_output.txt 的文件。我们将设置它在现在的一分钟后运行。

首先,使用所需的时间规范调用 at 命令。

at now + 1 minute

按下 Enter 后,你的终端提示符将变为 at>。这表示 at 正在等待你输入要调度的命令。现在,输入创建文件并向其中写入一些文本的命令。

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

输入命令后按 Enter。要完成作业并退出 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

按 Enter,然后按 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        <---- easiest
  2. /usr/bin/vim.basic
  ...

Choose 1-2 [1]:

1 然后按 Enter 选择 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 确认更改,最后按 Enter 将更改写入文件。

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

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 代表 "list"(列表))将你的 crontab 文件的内容直接显示到终端。

crontab -l

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

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

此命令是一种安全的、只读的方式来检查计划了哪些作业。

现在,假设你不再需要这个周期性作业。要移除它,你可以使用 crontab -r 命令(其中 -r 代表 "remove"(移除))。请非常小心使用此命令,因为它会移除你用户整个 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 作业。