计算机擅长自动化,但不是每个人都知道如何使自动化发挥作用。不过,能够在特定时间为计算机安排一项任务,然后忘记它,这确实是一种奢侈。也许你有一个文件要在特定的时间上传或下载,或者你需要处理一批还不存在但保证在某个时间存在的文件,或者需要监控的设置,或者你只是需要一个友好的提醒,在下班回家的路上拿起面包和黄油。
这就是at 命令的作用。
什么是Linux at命令?
at 命令是Linux终端允许你在特定时间和日期安排一次性工作的方法。它是自发的自动化,在终端上很容易实现。
安装at
在Linux上,at 命令可能已经安装了。你可以用at -V 命令来验证它是否已经安装。只要返回的是一个版本,你就已经安装了at 。
如果你试图使用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>
job 3 at Mon Jul 26 11:20:00 2021
正如你所看到的,at 使用直观和自然的时间定义。你不需要知道24小时制的时钟,也不需要把时间翻译成UTC或特定的ISO格式。一般来说,你可以使用你自然想到的任何符号,如中午、下午1:30、13:37,等等,来描述你希望一个任务发生的时间。
等待几分钟,然后通过运行""来验证你的任务是否已经运行。 [cat](https://opensource.com/article/19/2/getting-started-cat-command)或 [tac](https://opensource.com/article/19/9/tac-command)命令来验证你的任务是否已经运行。
$ cat ~/at-test.txt
hello world
安排一项工作的时间为
你不必使用交互式提示符来安排工作,at 。你可以使用echo 或管道命令来代替。 [printf](https://opensource.com/article/20/8/printf).在这个例子中,我使用了现在和从现在开始多少分钟的符号,我希望任务被延迟。
$ echo "echo 'hello again' >> ~/at-test.txt" | at now +1 minute
一分钟后,验证新的命令是否已经被执行。
$ cat ~/at-test.txt
hello world
hello again
时间表达式
at 命令在解释时间时是很宽容的。你可以在许多格式中选择,这取决于哪一种对你来说最方便。
YYMMDDhhmm[.ss]
(缩写的年、月、日、时、分,也可选择秒)CCYYMMDDhhmm[.ss]
(完整的年、月、日、时、分,以及可选择的秒)。nowmidnightnoonteatime(下午4点)AMPM
时间和日期可以是绝对的,也可以加一个加号*(+),使其与现在*相对。当指定相对时间时,你可以使用你可能已经使用的词语。
minuteshoursdaysweeksmonthsyears
时间和日期的语法
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 队列,使用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 spool。只有根用户可以查看at spool,所以你必须使用sudo 来查看spool或cat 任何作业的内容。
用Linux安排
at 系统是一个很好的方法,可以避免忘记在一天的晚些时候运行一个作业,或者在你离开时让你的计算机为你运行一个作业。不像cron ,它没有期望一个工作必须从现在开始到永久按计划运行,因此它的语法比cron 的语法简单得多。
下次你有一个小工作,希望你的计算机记住并管理它,试试at 命令。