使用 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 格式。通常,您可以使用任何对您来说自然的符号,例如中午下午 1:3013: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

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

  • 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/

感谢我在这里学到的很棒的东西!!
Happy hacking!

回复 作者:sethkenlon

知识共享许可协议本作品根据知识共享署名-相同方式共享 4.0 国际许可协议获得许可。
© . All rights reserved.