使用 Linux at 命令调度任务

at 命令是 Linux 终端允许您为特定时间和日期安排一次性作业的方法。
56 位读者喜欢这篇文章。
Team checklist

计算机擅长自动化,但并非每个人都知道如何实现自动化。 然而,能够安排计算机在特定时间执行任务,然后将其抛诸脑后,真是一种奢侈。 也许您需要在特定时间上传或下载文件,或者您需要处理一批尚不存在但保证在特定时间存在的文件,或者需要监控某个设置,或者您只是需要一个友好的提醒,在下班回家的路上买些面包和黄油。

这就是 at 命令的用途。

什么是 Linux at 命令?

at 命令是 Linux 终端允许您为特定时间和日期安排一次性作业的方法。 它是从终端轻松实现的自发自动化。

安装 at

在 Linux 上,at 命令可能已经安装。 您可以使用 at -V 命令验证是否已安装。 只要返回版本号,就说明您已安装 at

$ at -V
at version x.y.z

如果您尝试使用 at 但找不到该命令,则大多数现代 Linux 发行版都会提示您安装缺少的 at 软件包。

您可能还需要启动 at 守护程序,称为 atd。 在大多数 Linux 系统上,您可以使用 systemctl 命令来启用服务并设置它们从现在开始自动启动

$ sudo systemctl enable --now atd

使用 at 交互式调度作业

当您将 at 命令与要运行任务的时间一起使用时,您将打开一个交互式 at 提示符。 您可以输入要在指定时间运行的命令。

如果这有帮助,您可以将此过程视为日历应用程序,就像您可能在手机上使用的应用程序一样——首先,您在某天的某个时间创建一个事件,然后指定您希望发生什么。

例如,尝试通过在未来几分钟内创建一个任务来给自己安排一个备忘录。 使任务简单化以降低失败的可能性。 要退出 at 提示符,请按键盘上的 Ctrl+D

$ at 11:20 AM
warning: commands will be executed using /bin/sh
at> echo "hello world" > ~/at-test.txt
at> <EOT>
job 3 at Mon Jul 26 11:20:00 2021

如您所见,at 使用直观且自然的时间定义。 您无需了解 24 小时制时钟或将时间转换为 UTC 或特定的 ISO 格式。 通常,您可以使用任何对您来说自然的表示法,例如noon1:30 PM13:37 等,来描述您希望任务发生的时间。

等待几分钟,然后通过在您创建的文件上运行 cattac 命令来验证您的任务是否已运行

$ cat ~/at-test.txt
hello world

使用 at 调度作业

您不必使用交互式提示符来使用 at 调度作业。 您可以使用 echoprintf 将命令管道传输到它。 在此示例中,我使用 now 表示法以及从现在起我希望任务延迟多少分钟

$ echo "echo 'hello again' >> ~/at-test.txt" | at now +1 minute

一分钟后,验证新命令是否已执行

$ cat ~/at-test.txt
hello world
hello again

时间表达式

在解释时间时,at 命令非常宽容。 您可以在多种格式之间进行选择,具体取决于哪种格式对您最方便

  • YYMMDDhhmm[.ss]

    (缩写年份、月份、日期、小时、分钟,以及可选的秒)
  • CCYYMMDDhhmm[.ss]

    (完整年份、月份、日期、小时、分钟,以及可选的秒)
  • now
  • midnight
  • noon
  • teatime (下午 4 点)
  • AM
  • PM

时间和日期可以是绝对的,也可以添加加号 (+) 使它们相对于 now。 指定相对时间时,您可以使用您可能已经使用的单词

  • minutes
  • hours
  • days
  • weeks
  • months
  • years

时间和日期语法

at 命令在区分时间和日期方面不太宽容。 时间必须在日期之前,尽管日期默认为当前日期,并且仅在计划将来某天的任务时才需要。

以下是一些有效的表达式示例

$ echo "rsync -av /home/tux me@myserver:/home/tux/" | at 3:30 AM tomorrow
$ echo "/opt/batch.sh ~/Pictures" | at 3:30 AM 08/01/2022
$ echo "echo hello" | at now + 3 days

查看您的 at 队列

一旦您接受了 at 并开始调度任务,而不是在办公桌周围散落的纸片上乱写笔记,您可能需要查看是否还有作业在队列中。

要查看您的 at 队列,请使用 atq 命令

$ atq
10 Thu Jul 29 12:19:00 2021 a tux
9  Tue Jul 27 03:30:00 2021 a tux
7  Tue Jul 27 00:00:00 2021 a tux

要从队列中删除任务,请使用 atrm 命令以及作业编号。 例如,要删除作业 7

$ atrm 7
$ atq
10 Thu Jul 29 12:19:00 2021 a tux
9  Tue Jul 27 03:30:00 2021 a tux

要查看计划作业中实际包含的内容,您必须查看 at 后台处理程序。 只有 root 用户才能查看 at 后台处理程序,因此您必须使用 sudo 才能查看后台处理程序或 cat 任何作业的内容。

使用 Linux at 调度

at 系统是一种避免忘记在当天晚些时候运行作业或让您的计算机在您离开时为您运行作业的绝佳方法。 与 cron 不同,它不受作业必须从现在到永远定期运行的期望的约束,因此它的语法比 cron 语法简单得多。

下次您有想要计算机记住和管理的小作业时,请尝试使用 at 命令。

接下来阅读什么
标签
Seth Kenlon
Seth Kenlon 是一位 UNIX 极客、自由文化倡导者、独立多媒体艺术家和 D&D 爱好者。 他曾在电影和计算机行业工作,并且经常同时工作。

4 条评论

atd (at 守护进程) 应该正在运行...

问候

我已经将这篇文章翻译/改编成西班牙语,并在我的小博客上发表了

https://victorhckinthefreeworld.com/2021/08/19/programar-tareas-con-el-comando-at-en-linux/

感谢我在这里学到的好东西!!
快乐黑客!

回复 作者 sethkenlon

© . All rights reserved.