为什么我们在 Linux 中需要“at”命令?

Aks*_*til 39 bash at

我正在研究at使用该命令的代码。我环顾四周,发现它是用来执行批处理作业的。它用于调度作业。给定一个命令和一个相对的或绝对的时间作为它的输入。

所以,我的第一个问题是:为什么at使用该命令?什么情况下需要使用at?当有一些 bash 脚本代码试图卸载软件以及一些后台服务要重新启动时,我遇到过它。

我的第二个问题:将任何命令作为批处理作业执行与直接(或在子shell 中)调用命令时执行命令有什么区别?

Mar*_*iae 47

Bernhard 的回答是正确的:在多用户系统中,在某些不敬虔的夜晚执行繁重程序的能力对于提交工作的人和他的同事来说都特别方便。这是“玩得开心”的一部分。

我完成了大部分博士学位。以这种方式进行计算,将脚本与nice命令相结合,当其他人让机器忙碌时,它会降低我的工作优先级,同时保持其在晚上占用所有系统资源的能力。

我使用了相同的命令来检查我的程序是否正在运行,并在必要时重新启动它。

此外,您应该记住at是在screen、tmux 等之前编写的,因此它是一种分离外壳的简单方法,即一旦您退出系统就不会死的外壳。

最后,您还应该注意到它与 cron 不同,后者也已经存在了很长时间。不同之处在于 at 是偶尔的,而 cron 如此重复,更适合真正需要以固定时间间隔永远执行的系统作业:实际上,at为您提供了自己的环境,具有自己的设置(和选择)的环境变量,而cron使用最少的环境变量集(例如,只需检查PATH 中的差异)。

  • 同样值得指出的是,与 cron 的另一个不同之处在于,`at` 会按照作业计划时的方式保留您的环境:相同的工作目录、环境变量…… (15认同)
  • 还有 `batch`,它几乎与 `at` 相同,但会等待低负载,显然,`at -qz` 会自己完成这项工作,而 `at -q Z` 会等待时间,然后等待负载下降,并做好工作。哇,这么多很少使用的功能! (10认同)

Ber*_*ard 16

at当我需要对数据进行一些繁重的处理时,我会使用该命令,我想在夜间执行,当我不在我的电脑后面时。当然我可以在我离开后立即开始这个过程,但这是我容易忘记的事情。

命令的结果与脚本或命令的定期执行没有区别。


slm*_*slm 16

当您有此类问题时,请务必查阅手册页。他们可以非常有启发性。

它能做什么

摘自手册页

NAME
       at, batch, atq, atrm - queue, examine or delete jobs for later execution

DESCRIPTION
       at  and  batch  read  commands  from  standard  input or a specified file
       which are to be executed at a later time, using /bin/sh.
Run Code Online (Sandbox Code Playgroud)

用法

工具的使用:

Usage: at [-V] [-q x] [-f file] [-mldbv] timespec ...
       at [-V] [-q x] [-f file] [-mldbv] -t time
       at -c job ...
       atq [-V] [-q x]
       atrm [-V] job ...
       batch
Run Code Online (Sandbox Code Playgroud)

at包括4个命令(atatqatrm,和batch)。您可以使用atbatch来安排作业、atq查看已安排的内容以及atrm在运行之前删除作业。

$ at -f <cmd> timspec
Run Code Online (Sandbox Code Playgroud)

时间规格

at可以通过不同方式指定运行作业的时间。

手册页上的摘录形式

At 允许相当复杂的时间规范,扩展了 POSIX.2 标准。它接受 HH:MM 形式的时间以在一天中的特定时间运行作业。(如果该时间已经过去,则假定为第二天。)您还可以指定 mid? 晚上、中午或下午茶时间(下午 4 点),您可以在一天中的时间后缀 AM 或 PM,以便在早上或晚上跑步。您还可以指定作业将在哪一天运行,通过以月份名称日的形式提供可选年份的日期,或以 MMDD[CC]YY、MM/DD/[CC]YY、MM/DD/[CC]YY 格式提供日期, DD.MM.[CC]YY 或 [CC]YY-MM-DD。日期的规范必须遵循一天中的时间规范。您还可以给出像 now + count time-units 这样的时间,其中 time-units 可以是分钟、小时、天,

例子

假设你有这个 shell 脚本。

$ cat mycrontest.sh

#!/bin/bash
 echo "It is now $(date +%T) on $(date +%A)"
Run Code Online (Sandbox Code Playgroud)

示例运行:

$ ./mycrontest.sh
It is now 18:37:42 on Friday
Run Code Online (Sandbox Code Playgroud)

作业提交示例:

$ at -f mycrontest.sh  10pm tomorrow
job 14 at Sun Jul  8 22:00:00 2007

$ at -f mycrontest.sh 2:00 tuesday
job 15 at Tue Jul 10 02:00:00 2007

$ at -f mycrontest.sh 2:00 july 11
job 16 at Wed Jul 11 02:00:00 2007

$ at -f mycrontest.sh 2:00 next week
job 17 at Sat Jul 14 02:00:00 2007
Run Code Online (Sandbox Code Playgroud)

参考


Ora*_*Dog 6

您的网络管理员会通知您,您的 Web 服务器将从晚上 7 点开始到凌晨 2 点结束。您希望事先提供维护通知,并且希望系统的正常运行时间达到最长。你是不是要熬夜,准备好运行各种命令,然后再重新启动?不,你想用它at来安排这些任务,然后上床睡觉/玩天际并忘记它。


小智 6

您可以使用三个命令中的任何一个在 UNIX/Linux 中执行批处理作业 — at、batch 或 cron。

使用特定日期和时间安排 at 作业

Syntax:

    $ at time date
For example, to schedule a job at 11 am on May 20, use the following at command.

    $ at 11 am may 20
Run Code Online (Sandbox Code Playgroud)