蚊章汇 - at
type: channel
link: https://linuxcn.bwsl.wang/tag/at/
items: 用 Linux 的 at 命令来安排一个任务
items: 使用 at 命令在 Linux 上安排任务

用 Linux 的 at 命令来安排一个任务
type: item
date: 2021-08-23T22:45:53+08:00
description: at 命令是一种在特定时间和日期安排一次性任务的 Linux 终端方法。计算机擅长 自动化，但不是每个人都知道如何使自动化工作。不过，能够在特定的时间为电脑安排一个任务，然后忘记它，这确实是一种享受。也许你有一个文件要在特定的时间上传或下载，或者你需要处理一批还不存在但可以保证在某个时间存在的文件，或者需要监控设置，或者你只是需要一个友好的提醒，在下班回家的路上买上面包和黄油。这就是 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 格式。一般来说，你可以使用你自然想到的任何符号，如 noon、1:30 PM、13:37 等等，来描述你希望一个任务发生的时间。等待几分钟，然后在你创建的文件上运行 cat 或者 tac 命令，验证你的任务是否已经运行：$ cat ~/at-test.txt hello world 用 at 安排一个任务你不必使用 at 交互式提示符来安排任务。你可以使用 echo 或 printf 向它传送命令。在这个例子中，我使用了 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 1…

使用 at 命令在 Linux 上安排任务
type: item
date: 2020-04-10T05:59:59+08:00
description: at 命令可以很容易地安排 Linux 任务在你选择的任何时间或日期运行，让我们来看看它能为你做什么。当你希望命令或脚本在某个特定时间运行时，你不需要将手指放在键盘上盘旋等待按下回车键，或者是在特定时间坐在办公桌前。相反，你可以通过 at 命令来设置任务。在本文中，我们将研究如何使用 at 来安排任务，如何精确地选择任务希望运行的时间，以及如何使用 at 来查看安排运行的任务。at vs cron对于那些使用 cron 在 Linux 系统上安排任务的人来说，at 命令类似于 cron，因为你可以在选定的时间调度任务，但是 cron 用于定期运行的作业 —— 甚至是每年仅一次。大多数 cron 作业的频率都设置为每天、每周或每月运行一次，不过你可以控制运行的频率和时间。另一方面，at 命令用于仅运行一次的任务。想在午夜重启系统？没问题，只要你有适当的权限，at 可以为你完成此操作。如果你希望系统在每个星期六凌晨 2 点重启，那么改用 cron。使用 atat 命令很容易使用，只需记住几件事。一个简单使用 at 的例子类似于这样：$ at 5:00PM at> date >> thisfile at> <EOT>在输入 at 和应该运行命令的时间，at 会提示你在设定时间会运行该命令（此例中是 date 命令）。输入 ^D（Ctrl + 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:22。6:22 PM 这样也是可以工作的。你也可以通过使用 at 来安排命令在指定的日期或时间运行，例如 10:00AM April 15 2021 或 noon + 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 身份运行作业要以 ro…