ubuntu 定时任务

817 阅读2分钟

一次性定时任务 at

at 为一次性定时任务命令,该命令会将作业提交到队列中,指定 shell 何时运行这些命令。at 的守护进程 atd 会以后台模式运行,检查作业队列来运行作业。atd 守护进程会检查系统上的一个特殊目录来获取 at 命令的提交的作业。

默认情况下,atd 守护进程每 60 秒检查一次目录。有作业时,会检查作业运行时间,如果时间与当前时间匹配,则运行此作业。

权限控制

/etc/at.allow 与 /etc/at.deny 这两个文件负责 at 命令权限控制。at 实际工作流程如下:

  • 先寻找 /etc/at.allow ,如果存在(白名单模式),写在这个文件中的 user 才能使用 at,没有在这个文件中的 user 不能使用 at,/etc/at.deny 在此情况下无用
  • 如果 /etc/at.allow 不存在,就寻找 /etc/at.deny (黑名单模式),写在其中的 user 不能使用 at
  • 如果两个文件都不存在(root 模式),只有 root 可以使用 at 命令

/etc/at.allow 管理较为严格,而 /etc/at.deny 则较为松散。大多数 distributions 假设系统上的所有 user 都是可信任的,系统通常会保留一个空的 /etc/at.deny 文件,即允许所有人使用 at 命令。

使用与管理

终端打印 Hello 消息

$ at now + 5 minutes
at> echo "Hello" > /dev/pts/0
at> echo "Another msg" > /dev/pts/0
<EOT> # 敲 Ctrl+D
job 4 at Mon May 4 13:55:00 2020

$ at -c 4   # 查看任务4详情,输出环境变量+命令本身
$ atq *     # 查看所有任务号与时间
$ atrm 4    # 移除任务4

闲时任务 batch

batch 本质仍然是用 at 下达命令,不同处在于:他是在 CPU 工作负载 < 0.8 时才执行任务。

CPU 负载即 CPU 在单一时间点所负责的工作数量(不是 CPU 使用率)。For example,有一个计算密集型任务,运行时 CPU 的使用率到达 100% ,但工作负载则是接近 1 ,因为 CPU 仅负责一个工作;如果同时运行两个这样的任务,使用率仍是 100% ,但工作负载则变成 2。

范例一:机房停电在 2020/5/5 23:00 关机,但若当时系统负载太高,则暂缓运行

$ batch 23:00 2020-5-5
at> sync
at> sync
at> shutdown -h now
at> <EOT>
job 6 at 2009-03-17 23:00

$ atq
6       2009-03-17 23:00 b root

闲时任务也是用 atq, atrm 来管理

周期任务 cron

cron 是 Linux 定时执行工具,可以在无需人工干预的情况下运行作业。cron 是被默认安装并启动的。通过 /etc/crontab 文件,可以看到以下内容: