一、计划任务概述

计划任务即让系统在规定时间自动执行指定操作,无需人工值守。Linux 中的计划任务服务主要有三种:

服务 用途 说明
atd 一次性计划任务 只能精确到某一分钟的第 0 秒;若需精确到秒,可通过 shell 脚本实现
crond 周期性计划任务 按分、时、日、月、周循环执行
anacrond 非全天候运行主机的计划任务 RHEL 6 中已整合进 crond

二、atd:一次性计划任务

2.1 安装与服务管理

ps -ef | grep atd          # 查看 atd 服务是否开启
service atd start          # 启动 atd 服务
chkconfig atd on           # 设置开机自启动

若提示无法识别该服务,说明未安装:

yum install -y at

2.2 创建 at 任务

使用格式:

at <时间>

示例:在 2016 年 10 月 20 日 14:14 执行任务。

at 14:14 102016
at> echo "haha" > /dev/pts/1
at> <EOT>                  # 输入完成后按 Ctrl+D 结束

输出:

job 1 at 2016-09-23 14:14

其中 job 1 为任务编号,后续为该任务的执行时间。

2.3 at 常用选项

选项 作用 等价命令
-l 列出尚未执行的 at 任务 atq
-d <编号> 删除指定 at 任务 atrm <编号>
-c <编号> 查看任务内容 —
-f <文件> 从指定文件读取任务并执行 —

示例:

at -l                      # 或 atq
at -d 3                    # 删除编号为 3 的任务(或 atrm 3)
atq                        # 再次查看

输出示例:

3  2014-07-24 15:25 a root
4  2014-07-25 14:25 a root
6  2015-07-24 14:25 a root

2.4 使用脚本执行多步任务

当任务步骤较多时,先写成脚本,再通过 -f 调用:

at -f xxx.sh

先准备脚本 /tmp/1.sh:

#!/bin/bash
echo 1 > /dev/pts/1
echo 2 > /dev/pts/1
echo 3 > /dev/pts/1

相对时间写法示例:

at now + 1 minutes -f /tmp/1.sh    # 当前时间 +1 分钟执行
at now + 1 hours   -f /tmp/1.sh    # 当前时间 +1 小时执行
at now + 1 days    -f /tmp/1.sh    # 当前时间 +1 天执行
at now + 1 months  -f /tmp/1.sh    # 当前时间 +1 个月执行
at now + 1 years   -f /tmp/1.sh    # 当前时间 +1 年执行

2.5 时间写法

at 支持使用 AM/PM、tomorrow、月份名称等:

at 6.45 am May 12          # 5 月 12 日上午 6:45
at 11.10 pm                # 当天晚上 11:10
at 9am tomorrow            # 明天上午 9:00
at 15:00 May 24            # 5 月 24 日 15:00

更多时间格式可查阅手册:

man at

2.6 任务存储与权限控制

at 任务以可执行文件形式存放在:

/var/spool/at/

可直接 cat 查看,其内容与 at -c <编号> 一致。

通过以下两个文件控制普通用户是否可使用 at:

文件 作用
/etc/at.allow 白名单,默认可手动创建,仅其中用户可使用 at
/etc/at.deny 黑名单,其中用户禁止使用 at

2.7 batch:资源空闲时执行

batch 是 at 的特殊版本,适用于会占用大量资源的任务,仅当 CPU 负载低于 80% 时才执行:

batch
at> echo "hi" > /dev/tty2
at> <EOT>                  # Ctrl+D 结束

batch 创建的任务同样使用 atq 查看、atrm 删除。


三、crond:周期性计划任务

3.1 服务管理

service crond start        # 启动服务(或 /etc/init.d/crond start)
chkconfig crond on         # 开机自启动

3.2 主配置文件 /etc/crontab

vim /etc/crontab

文件头部环境变量(RHEL 5 中显式列出,RHEL 6 中虽不显示但仍然生效):

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/

各变量含义:

变量 含义
SHELL 指定执行命令使用的 shell
PATH 命令搜索路径
MAILTO 任务执行信息以邮件发送给指定用户
HOME 执行命令或脚本时使用的主目录

3.3 时间字段格式

任务定义格式:

分  时  日  月  周  用户  命令

字段取值范围:

字段 范围 说明
分 minute 0–59 —
时 hour 0–23 —
日 day of month 1–31 —
月 month 1–12 也可写 jan,feb,mar,...
周 day of week 0–6 周日为 0 或 7;也可写 sun,mon,...,sat

字段内符号:

符号 含义 示例
* 任意时间(每分/每时/每天...) * * * * * 每分钟
, 离散时间点 1,3,7 表示 1、3、7
- 连续时间范围 2-10 表示 2 到 10
*/n 每隔 n 个单位 */2 表示每 2 分/小时

3.4 配置示例

示例 1:每分钟以 root 执行一条命令

* * * * * root echo heihei > /dev/pts/5

表示每分钟以 root 身份执行一次 echo heihei > /dev/pts/5。

示例 2:按分钟执行目录下所有脚本

* * * * * root run-parts /etc/cron.minutely

run-parts 会执行指定目录下所有具备可执行权限的脚本。脚本需要有 x 权限:

mkdir /etc/cron.minutely
vim /etc/cron.minutely/1.sh
chmod 755 /etc/cron.minutely/*

1.sh 示例:

#!/bin/bash
echo haha > /dev/pts/5

3.5 crontab 命令

每个用户可通过 crontab 管理自己的周期任务,格式:

crontab [-u user] 选项

常用选项:

选项 作用
-u <用户名> 指定用户(默认当前用户)
-e 编辑当前用户的 crontab 文件
-l 列出当前用户 crontab 内容
-r 删除当前用户的 crontab 文件

通过文件创建并加载

touch /tmp/cronfile
echo "* * * * * echo 1 > /dev/pts/2" >> /tmp/cronfile
crontab /tmp/cronfile       # 加载新建的 crontab 文件
crontab -l                  # 列出内容

直接编辑

crontab -e

编辑内容时,由于已确定用户身份,不需要再写用户名字段:

01 21 * * * /sbin/init 0

为其他用户编辑:

crontab -u user1 -e

crontab -e 实际编辑的是 /var/spool/cron/ 下对应用户名的文件,直接修改该文件效果相同:

/var/spool/cron/user1

删除当前用户的所有计划任务:

crontab -r

3.6 crontab 权限控制

文件 作用
/etc/cron.deny 黑名单,其中用户不允许使用 crontab
/etc/cron.allow 白名单,其中用户允许使用 crontab
/var/spool/cron/ 所有用户 crontab 文件存放目录,以用户名命名

练习与实验

  1. 启动 atd 服务并设置开机自启,使用 at 在当前时间 2 分钟后向 /dev/pts/1 输出一条消息。

  2. 编写一个 shell 脚本,使用 at -f 让系统 1 小时后执行该脚本。

  3. 使用 atq、at -c、atrm 完成任务的查看、检查与删除。

  4. 配置 /etc/crontab:

    • 每分钟以 root 身份向指定终端写入一条消息;
    • 使用 run-parts 每分钟执行某一目录下所有可执行脚本。
  5. 使用 crontab -e 为当前用户设置一条每天 21:01 关机的任务,并通过 crontab -l 查看、crontab -r 删除。

最后修改:2026 年 09 月 20 日
如果觉得我的文章对你有用,请随意赞赏