跳转至

计划任务

约 682 个字 60 行代码 预计阅读时间 3 分钟

select-editor - 选择默认编辑器

一些需要进行编辑的命令,首次执行前,会问选择什么编辑器:

1
2
3
4
5
6
7
Select an editor.  To change later, run 'select-editor'.
  1. /bin/nano        <---- easiest
  2. /usr/bin/vim.basic
  3. /usr/bin/vim.tiny
  4. /bin/ed

Choose 1-4 [1]:

仅执行一次的计划任务

at -仅执行一次的计划任务

适用于临时的、一次性的计划任务。

需要 atd 服务开启。

要执行的任务脚本会被放在 /var/spool/cron/atjobs/(Ubuntu)或 /var/spool/at/(CentOS)中。

各用户使用该命令的权限:

  • 如有 /etc/at.allow,则只有该文件内的用户可以执行
  • 如无 /etc/at.allow,但有 /etc/at.deny,则只有该文件内的用户不可执行
  • 如两个文件都不存在,则只有 root 可以执行

默认会有一个空的 /etc/at.deny 文件。

使用方法

at -l   # 或 atq             # 列出系统上所有用户的 at 计划
at -d 任务号码  # 或 atrm 任务号码   # 取消对应的 at 计划
at -c 任务号码              # 查看对应的 at 任务详情
# 下面是关于时间的写法
at HH:MM                    # 在 HH:MM 执行(如果今天已经过了这个点,就放到明天)
at HH:MM YYYY-MM-DD         # 在 YYYY-MM-DD HH:MM 执行
at HH:MM[am|pm] [月份的英文] [DD]        # 在 月份-DD HH:MM [am|pm] 执行
at 04pm July 30             # 在 07-30 16:00 执行
at HH:MM[am|pm] + 数字 [minutes|hours|days|weeks]     # 在某个时间点后再加一段时间执行
at now + 5 minutes          # 在 5 分钟之后执行(以执行该命令的时间为准)

ding@ding-server:~$ at now + 5 minutes  # now 以在这里按回车键的时间为准
warning: commands will be executed using /bin/sh
# 默认是用 sh 执行的(在 Ubuntu 上就是 dash,故如果要用 bash 执行,则最好先写好脚本再用 bash 执行)
at> /bin/echo 'hello from atd' > /home/foxconn/hello_atd.txt    # 开始输入脚本,为避免可能的问题,最好使用绝对路径
at> /bin/echo 'hello world' > /home/foxconn/hello_world.txt                     
at> <EOT>   # 按 Ctrl + D 结束输入,会显示这个
job 4 at Tue Jun  7 10:07:00 2022           # 会提示你什么时候执行
ding@ding-server:~$ atq
4       Tue Jun  7 10:07:00 2022 a foxconn
ding@ding-server:~$ at -c 4
#!/bin/sh
# atrun uid=1000 gid=1000
# mail foxconn 0
umask 2
# 设置环境变量略
cd /home/foxconn || {
         echo 'Execution directory inaccessible' >&2
         exit 1
}
/bin/echo 'hello from atd' > /home/foxconn/hello_atd.txt
/bin/echo 'hello world' > /home/foxconn/hello_world.txt

ding@ding-server:~$ atrm 4
ding@ding-server:~$ # 任务已删除
# 若任务未删除,时间到的时候,可以看到那两个文件

batch - 闲时执行任务

at 很像,但不定义时间。

在 CPU 1 分钟负载小于给定值时,才会执行(Ubuntu 默认为 1.5,CentOS 默认为 0.8)。

定义后能够通过 atatdatrm 管理。

cron - 定期执行的计划任务

对应服务 crond

用户权限控制和 at 很像,把 at 换成 cron 即可;但如果两个文件都不存在,则所有用户都可以使用。

CentOS 中,执行记录会记录到 /var/log/cron;Ubuntu 默认未开启。

crontab - 配置 cron

crontab [选项]

选项:

  • -u 用户名:帮其他用户操作(需 root 权限)
  • -e:编辑
  • -l:查看
  • -r:删除所有

cron 配置文件

  • 每个用户的(通过 crontab -e 编辑):
    • /var/spool/cron/crontabs/用户名(Ubuntu)
    • /var/spool/cron/用户名(CentOS)
  • 系统的:
    • /etc/crontab
    • /etc/cron.d/*

对于每个用户的 cron 配置文件格式

1
2
3
4
5
6
7
8
    周几 命令
|  |  |  |  |  |
|  |  |  |  |  最好用绝对路径
|  |  |  |  0-7 或周英文前三位,周日可以是 0  7
|  |  |  1-12 或月份英文前三位
|  |  1-31
|  0-59
0-59

填数字(分、时、日、月、周几)时,可用特殊符号:

  • *:任意
  • a,bab
  • a-b:从 ab
  • a/ba 区间(可以是 c-d,也可以是 *)中,每隔 b
    • 如月份 1-12/2*/2 等价于 1,3,5,7,9,11

Info

如果“日”和“周几”都定义有值,则其中只要一个条件满足,则条件满足。

例:

每周五 19:00 重启一次:

参考答案 需要放在 root 的 cron 配置文件中。
0 19 * * 5 /usr/sbin/reboot

奇数月的中旬 12:00~14:00,每 5 分钟请求给定 URL:

参考答案
1
2
3
# 要写两个
*/5 12-13 11-20 */2 * /usr/bin/curl URL
0 14 11-20 */2 * /usr/bin/curl URL

系统的 cron 配置文件格式

上方有定义变量的命令:

1
2
3
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root         # 有额外输出时,发送邮件给谁

下方的格式:

    周几 用户名 命令
# 注意这里有用户名

其他定期执行的脚本

/etc/cron.hourly/*/etc/cron.daily/*/etc/cron.weekly/*/etc/cron.monthly/*:依给定频率执行其中的脚本,脚本格式与普通脚本一样。

这些实际上由 anacron 管理,确保即使遇到停机,也会在恢复后执行命令。

Ubuntu 中被写进了 /etc/crontab;CentOS 中配置文件 /etc/anacrontab

参考资料

  • 鸟哥的Linux私房菜. 基础学习篇 / 鸟哥著 ; Linux 中国繁转简. -- 4版. -- 北京 : 人民邮电出版社, 2018.3; ISBN 978-7-115-47258-8
  • Linux就该这么学 / 刘遄著. -- 北京 : 人民邮电出版社, 2017.11; ISBN 978-7-115-47031-7
  • Linux 教程 | 菜鸟教程