一、计划任务概述
计划任务即让系统在规定时间自动执行指定操作,无需人工值守。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 文件存放目录,以用户名命名 |
练习与实验
-
启动
atd服务并设置开机自启,使用at在当前时间 2 分钟后向/dev/pts/1输出一条消息。 -
编写一个 shell 脚本,使用
at -f让系统 1 小时后执行该脚本。 -
使用
atq、at -c、atrm完成任务的查看、检查与删除。 -
配置
/etc/crontab:- 每分钟以 root 身份向指定终端写入一条消息;
- 使用
run-parts每分钟执行某一目录下所有可执行脚本。
-
使用
crontab -e为当前用户设置一条每天 21:01 关机的任务,并通过crontab -l查看、crontab -r删除。
此处评论已关闭