标签 at 下的文章

at 命令是一种在特定时间和日期安排一次性任务的 Linux 终端方法。

 title=

计算机擅长 自动化,但不是每个人都知道如何使自动化工作。不过,能够在特定的时间为电脑安排一个任务,然后忘记它,这确实是一种享受。也许你有一个文件要在特定的时间上传或下载,或者你需要处理一批还不存在但可以保证在某个时间存在的文件,或者需要监控设置,或者你只是需要一个友好的提醒,在下班回家的路上买上面包和黄油。

这就是 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 等等,来描述你希望一个任务发生的时间。

等待几分钟,然后在你创建的文件上运行 cat 或者 tac 命令,验证你的任务是否已经运行:

$ 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(午夜 00:00)
  • noon(中午 12:00)
  • teatime(下午 16 点)
  • 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

要看一个计划中的任务的实际内容,你需要查看 /var/spool/at 下的内容。只有 root 用户可以查看该目录的内容,所以你必须使用 sudo 来查看或 cat 任何任务的内容。

用 Linux at 安排任务

at 系统是一个很好的方法,可以避免忘记在一天中晚些时候运行一个作业,或者在你离开时让你的计算机为你运行一个作业。与 cron 不同的是,它不像 cron 那样要求任务必须从现在起一直按计划运行到永远,因此它的语法比 cron 简单得多。

等下次你有一个希望你的计算机记住并管理它的小任务,试试 at 命令。


via: https://opensource.com/article/21/8/linux-at-command

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

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

at 命令可以很容易地安排 Linux 任务在你选择的任何时间或日期运行,让我们来看看它能为你做什么。

当你希望命令或脚本在某个特定时间运行时,你不需要将手指放在键盘上盘旋等待按下回车键,或者是在特定时间坐在办公桌前。相反,你可以通过 at 命令来设置任务。在本文中,我们将研究如何使用 at 来安排任务,如何精确地选择任务希望运行的时间,以及如何使用 at 来查看安排运行的任务。

at vs cron

对于那些使用 cron 在 Linux 系统上安排任务的人来说,at 命令类似于 cron,因为你可以在选定的时间调度任务,但是 cron 用于定期运行的作业 —— 甚至是每年仅一次。大多数 cron 作业的频率都设置为每天、每周或每月运行一次,不过你可以控制运行的频率和时间。

另一方面,at 命令用于仅运行一次的任务。想在午夜重启系统?没问题,只要你有适当的权限,at 可以为你完成此操作。如果你希望系统在每个星期六凌晨 2 点重启,那么改用 cron。

使用 at

at 命令很容易使用,只需记住几件事。一个简单使用 at 的例子类似于这样:

$ at 5:00PM
at> date >> thisfile
at> <EOT>

在输入 at 和应该运行命令的时间,at 会提示你在设定时间会运行该命令(此例中是 date 命令)。输入 ^DCtrl + d)来完成请求。

假设我们在下午 5 点之前设置这个 at 命令,那么这个日期和时间将在当天下午 5 点添加到名为 thisfile 文件的末尾。否则,该命令将在第二天下午 5 点运行。

at 命令进行交互时,可以输入多个命令。如果你要同时运行多个命令,只需输入多个命令行即可:

$ at 6:22
warning: commands will be executed using /bin/sh
at> echo first >> thisfile
at> echo second >> thisfile
at> <EOT>

在上面的命令中,我们使用了一个普通的用户账户,将一些简单的文本添加到该用户主目录的文件中。如果在上午 6:22 之后运行这些命令,那么命令会在第二天运行,因为 6:22 表示上午 6:22。如果你想在下午 6:22 运行,使用 6:22 PM 或者 18:226:22 PM 这样也是可以工作的。

你也可以通过使用 at 来安排命令在指定的日期或时间运行,例如 10:00AM April 15 2021noon + 5 days(从今天起 5 天内的中午运行),以下是一些例子:

at 6PM tomorrow
at noon April 15 2021
at noon + 5 days
at 9:15 + 1000 days

在指定要运行的命令并按下 ^D 后,你会注意到 at 命令为每个请求分配了一个作业编号,这个数字将显示在 at 命令的作业队列中。

$ at noon + 1000 days
warning: commands will be executed using /bin/sh
at> date >> thisfile
at> <EOT>
job 36 at Tue Dec 27 12:00:00 2022        <== job # is 36

检查队列

你可以使用 atq(at queue)命令来查看 at 作业队列:

$ atq
32      Thu Apr  2 03:06:00 2020 a shs
35      Mon Apr  6 12:00:00 2020 a shs
36      Tue Dec 27 12:00:00 2022 a shs
34      Thu Apr  2 18:00:00 2020 a shs

如果你需要取消队列中的一个作业,使用 atrm(at remove)命令和作业编号:

$ atrm 32
$ atq
35      Mon Apr  6 12:00:00 2020 a shs
36      Tue Dec 27 12:00:00 2022 a shs
34      Thu Apr  2 18:00:00 2020 a shs

你可以使用 at -c 命令来查看安排任务的详细信息,其它详细信息(活动的搜索路径等)也可以看到,但是输出的最后一行将显示计划运行的命令。

$ at -c 36 | tail -6
cd /home/shs || {
         echo 'Execution directory inaccessible' >&2
         exit 1
}
date >> thisfile

注意,该命令显示首先会测试是否可以通过 cd 命令进入用户目录。如果不可以,作业将退出并显示错误。如果可以,则运行在 at 中指定的命令。它将命令视为 “进入 /home/shs 或退出并显示错误”。

以 root 身份运行作业

要以 root 身份运行 at 作业,只需将 sudo 与你的 at 命令一起使用,如下所示:

$ sudo at 8PM
[sudo] password for shs:
warning: commands will be executed using /bin/sh
at> reboot now
at> <EOT>
job 37 at Wed Apr  1 16:00:00 2020

注意,root 的任务以 root 作为执行者显示在队列中。

35      Mon Apr  6 12:00:00 2020 a shs
36      Tue Dec 27 12:00:00 2022 a shs
37      Wed Apr  1 20:00:00 2020 a root         <==

运行脚本

你还可以使用 at 命令来运行脚本,这里有一个例子:

$ at 4:30PM
warning: commands will be executed using /bin/sh
at> bin/tryme
at> <EOT>

禁止使用 at 命令

/etc/at.deny 文件提供了一种禁止用户使用 at 命令的方法。默认情况下,它可能会包含一个不允许的账户列表,例如 ftpnobody。可以使用 /etc/at.allow 文件执行相反的操作,但是通常只配置 at.deny 文件。

总结

当你要安排一项一次性任务时,无论你是希望在今天下午或几年后运行,at 命令都是通用且易于使用的。


via: https://www.networkworld.com/article/3535808/scheduling-tasks-on-linux-using-the-at-command.html

作者:Sandra Henry-Stocker 选题:lujun9972 译者:MjSeven 校对:wxy

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