Cron 很好,但不要忘记它的堂兄at
。
当我第一次开始使用 Linux 时,就像被扔进了 UNIX 池的最深处。您应该大量使用命令行以及发行版附带的所有标准实用程序和服务。从那以后发生了很多变化,现在,您可以使用标准的 Linux 桌面,而无需打开终端或使用旧的 UNIX 服务。如今,即使作为系统管理员,您通常也只是这些核心服务之上的几层抽象。
我说这一切是为了指出,对于我们这些老手来说,很容易认为我们周围的每个人天生就知道我们使用的所有命令行工具。然而,即使我已经使用 Linux 20 年了,我仍然一直在学习新的(对我而言)命令行工具。在这个“回归基础”系列文章中,我计划介绍一些 Linux 新手以前可能从未使用过的命令行工具。对于那些更高级的人,我将展开这个系列,这样您就可以期待未来的文章更具技术性。在本文中,我将介绍如何使用该at
实用程序来安排作业在以后运行。
at
与 Cronat
是那些很少讨论的命令之一。当人们谈论调度命令时,通常 cron 得到最多的覆盖。Cron 允许您安排命令定期运行。使用 cron,您可以每分钟运行一次命令,也可以每天、每周、每月甚至每年运行一次命令。您还可以定义更复杂的规则,例如,命令每五分钟、每个工作日、每隔一小时和许多其他组合运行。系统管理员有时会使用 cron 来安排本地脚本以每分钟收集一次指标或安排备份。
另一方面,虽然该at
命令还允许您安排命令,但它的用途与 cron 完全不同。虽然 cron 允许您安排命令定期运行,但at
允许您安排在未来特定时间只运行一次的命令。这意味着它at
满足了与 cron 不同且通常更直接的需求。
at
一度,该at
命令成为大多数 Linux 发行版的标准配置,但如今,即使在服务器上,您也可能会发现自己必须at
明确安装该软件包。安装后,最简单的使用方法at
是在命令行上键入它,然后是您希望命令运行的时间:
$ at 18:00
该at
命令还可以接受多种不同的时间格式。例如,它理解 AM 和 PM 以及像“tomorrow”这样的词,所以你可以用相同的命令替换上面的命令:
$ at 6pm
而且,如果您想在明天的那个时间运行相同的命令:
$ at 6pm tomorrow
按 Enter 后,您将进入一个交互式 shell:
$ at 6pm tomorrowwarning: commands will be executed using /bin/shat>
在交互式 shell 中,您可以输入当时要运行的命令。如果要运行多个命令,请在每个命令后按 Enter 并在新at>
提示符下键入命令。完成输入命令后,在空at>
提示下按 Ctrl-D退出交互式 shell。
例如,假设我注意到某个特定服务器在过去两天的凌晨 5 点 10 分出现了问题,持续了大约 5 分钟,到目前为止,我在日志中没有看到任何内容。虽然我能醒得早,并登录到服务器,而不是我可以写一个简短的脚本,从收集的数据ps
,netstat
,tcpdump
等命令行工具了几分钟,所以当我醒来时,我可以走了过来数据它收集。由于这是一次性的,我不想用 cron 安排一些事情并且冒着忘记它并让它每天运行的风险,所以我将如何设置它 at
:
$ at 5:09am tomorrowwarning: commands will be executed using /bin/shat>at> /usr/local/bin/my_monitoring_script
然后我会按 Ctrl-D,shell 将退出并显示以下输出:
at> <EOT>job 1 at Wed Sep 26 05:09:00 2018
at
工作一旦您安排了at
作业,能够拉出at
队列中所有作业的列表是很有用的,这样您就知道什么正在运行以及何时运行。该atq
命令列出当前at
队列:
$ atq1 Wed Sep 26 05:09:00 2018 a kyle
第一列列出at
分配给每个作业的编号,然后列出作业运行的时间和运行的用户。假设在上面的示例中,我意识到我犯了一个错误,因为我的脚本将无法以普通用户身份运行。在这种情况下,我想使用该 atrm
命令删除作业号 1:
$ atrm 1
如果我atq
再次运行,我会看到该工作不再存在。然后我可以sudo
达到 root 并使用该at
命令再次安排作业。
at
单线虽然at
支持交互模式,但您也可以改为在一行中通过管道将命令全部传递给它。因此,例如,我可以通过以下方式安排上述工作:
$ echo /usr/local/bin/my_monitoring_script | at 5:09am tomorrow
如果你不知道它的at
存在,你可能会发现自己想出了各种复杂而令人费解的方法来安排一次性工作。更糟糕的是,您可能需要设置一个闹钟,这样您就可以更早地醒来并登录到有问题的服务器。当然,如果你没有闹钟,你可以使用at
:
$ echo "aplay /home/kyle/alarm.wav" | at 7am tomorrow
评论专区