定时任务详解
1 .定时任务
1.1 概述
- 定时任务:用于执行在 Linux 中的重复性工作.eg: 命令 (同步系统时间), 脚本 (备份,系统巡检)
- 定时任务:类似于闹钟
1.2 服务使用流程
| 服务使用流程 | 说明 |
|---|---|
| 部署 | 安装这个服务或软件 |
| 配置 | 如何使用这个服务通过配置文件,通过命令。 |
| 优化或注意事项 | 安全…… |
| 排障 | A 通过错误提示解决。B 学会看日志。AB 高级:让服务输出错误提示或者输出更加详细的错误提示(通过重定向) |
| 其他 | 1 做好监控 2 做好备份 3 做好日志收集 4 统一认证 |
1.3 部署定时任务
-
定时任务软件包名字: cronie, 服务名字 (进程) crond
-q,查询;-a所有已安装 ;-l 列出软件包安装的所有文件 rpm -qa cronie rpm -ql cronie
| 目录结构 | 说明 |
|---|---|
| ① /var/spool/cron/ | 用户的定时任务的配置文件的目录 |
| ② crontab | 定时任务管理的命令 |
| ③ /var/log/cron | 定时任务日志 |
| 了解下就行的配置文件 | |
| /etc/crontab | 不推荐使用这个,系统定时任务的配置文件。 |
| /etc/cron.hourly/ | 系统定时任务,每小时运行。 |
| /etc/cron.daily/ | 系统定时任务,每天运行。 |
| /etc/cron.weekly/ | 系统定时任务,每周运行。 |
| /etc/cron.monthly/ | 系统定时任务,每个月运行。 |
- 检查是否运行

1) 配置的命令
crontab 用于对定时任务的规则进行增删改查.
| crontab 选项 | 说明 | |
|---|---|---|
| crontab -e | edit 编辑当前用户的定时任务 | vi /var/spool/cron/root #root 当前用户的名字 |
| crontab -l | list 查看当前用户的定时任务 | cat /var/spool/cron/root #root 当前用户的名字 |
[root@oldboy-85-vip-king-v2 oldboy]# crontab -l
no crontab for root用户未设置定时任务
[root@oldboy-85-vip-king-v2 oldboy]# crontab -e
no crontab for root - using an empty one用户未设置定时任务,给新建空的.
crontab: installing new crontab更新了定时任务的配置.
2)定时任务书写格式-时间
* * * * *
分 时 日 月 周
#每天早上 8:30 分 去学校 (go to school)
30 08 * * * go to school
#晚上 12 点上床睡觉 (go to bed/sleep)
* 00 * * * go to bed #每天的半夜 12 点 00 - 59 每分钟运行。
00 00 * * * go to bed #每天运行
备注:表示整点的时候,未说明分钟的时候,我们要指定的分钟,一般是 00。
关于分钟位置上是否写 * :涉及到小时,天,周几的时候,分钟位置上记得写个数 (00)
# 每周六半夜 12 点去 玩游戏
* 00 * * 06 game 每周的半夜 12 点 00-59, 每分钟1次
0-59
00 00 * * 06 game 每周六的半夜 12 点玩游戏
3) 定时任务时间部分的特殊符号
| 时间部分特殊符号 | 说明 | 案例 |
|---|---|---|
| / | 每隔 xxx 时间 | */2 * * * * 每 2 分钟00 */2 * * * 每 2 个小时 |
| - | 表示范围 | 00 08-22 * * * 08-22 点的每个小时运行 00 08-22/3 * * * 08-22 点的每 3 小时运行 |
| , | 表示独立时间 (没规律) | 00 08,11,14,17,20 * * * |
| * | 每,全部 / 所有 (没说具体时间) | * 在分钟的位置上表示 00-59, 每分钟的意思 * 在小时位置上表 00-23, 每小时的意思. |
#每天的上午 7 点到晚上 11 点 每二个小时运行 CMD 命令
00 07-23/2 * * * CMD
07 09 11 13 15 17 19 21 23
#定时任务每天 23 点到第 2 天的 7 点运行.
00 23,00-07 * * *
1.5 定时任务案例
- 同步时间
- 进行备份
- 日常循环操作
- 巡检 + 发送邮件
- 时间 + 命令格式
1) 案例01 每两分钟同步下系统的时间
- 使用了什么命令?ntpdate ntp1.aliyun.com
- 书写定时任务配置文件:
#1. 同步时间 by lidao996 at 20221111
*/2 * * * * /sbin/ntpdate ntp1.aliyun.com >/dev/null 2>&1
>/dev/null:将命令的 标准输出 重定向到 /dev/null(一个 “黑洞” 设备,丢弃输出内容),避免任务执行时产生多余的输出信息。
2>&1:将命令的 标准错误 也重定向到标准输出的目标(即 /dev/null),确保错误信息也被丢弃,让定时任务后台运行更 “安静”。
- 调试 (测试,检查)
- 修改下时间
1 date改下时间即可
- 日志:这个定时任务是否运行
定时任务日志只能提示是否运行了,但是无法告诉我们是否运行成功.
tail -f /var/log/cron
Nov 11 11:12:01 oldboy-aliyun-servers CROND[16436]: (root) CMD (/sbin/ntpdate ntp1.aliyun.com >/dev/null 2>&1)
Aug 8 10:46:20 oldboy-aliyun-servers CROND[16449]: (root) CMD (/sbin/ntpdate ntp1.aliyun.com >/dev/null 2>&1)
- 查看定时任务的结果 (时间是否修改,压缩包是否生成)
查看结果,时间是否同步.
2)案例 02:每天定时备份 /etc/ 到 /backup/ 下面
备份时间:业务低谷期.比如凌晨 1 点备份
☑ 命令: tar 命令
☑ 脚本:命令大礼包 .sh 结尾 .bash 结尾
☑ 定时任务配置:(每分钟运行)
☑ 调试完成改为要求的时间
- 命令:
mkdir -p /backup/
tar zcf /backup/etc-`date +%F_%w`.tar.gz /etc/
- 脚本
#专用脚本目录:
mkdir -p /server/scripts/
#书写脚本
cat backup-etc.sh
tar zcf /backup/etc-date +%F_%w.tar.gz /etc/
#执行脚本
sh backup-etc.sh
- 定时任务 - 时间每分钟或每 2 分钟 (调试)
#2. 定时备份 /etc/ 目录 by lidao996 at 时间
* * * * * /bin/sh /server/scripts/backup-etc.sh >/dev/null 2>&1
- 检查日志与结果

#持续监控目录下文件的详细列表变化。
watch ls -l

- 定时任务 - 调试完成后改为指定的时间运行
#2. 定时备份 /etc/ 目录 by lidao996 at xxxx
#00 01 * * * /bin/sh /server/scripts/backup-etc.sh >/dev/null 2>&1
3) 案例03: 脚本与变量
变量命名规则:
1, 不能以数字开头
2, 如果要用特殊符号,最好使用_
3, 变量名字能够体现出变量作用.
- 使用:
1 #赋值 修改变量内容(创建)
2 kui="欲练此功必先自宫,如不自宫也能成功"
3
4 #取值
5 echo $kui
6 欲练此功必先自宫,如不自宫也能成功
- 变量应用
#写入固定的内容
dir=/server/scripts/
file=backup-etc.sh
echo $dir $file
/server/scripts/ backup-etc.sh
echo $dir$file
/server/scripts/backup-etc.sh
#写入命令的结果(一般是命令的结果)
time=`date +%F_%w`
echo $time
2025-10-02_4
#变量只能赋值一次,显示同个时间
echo $time
2025-10-02_4
- 变量与命令(命令中如何使用变量)
创建以时间命名的文件 oldboy - 时间.txt
time=date +%F_%w
touch oldboy-$time.txt
- 在脚本中使用变量
[root@oldboy-aliyun-servers scripts]# cat /server/scripts/backup-etc-var.sh
#!/bin/bash
##定义变量
time=`date +%F_%w_%H`
##引用变量-备份
tar zcf /backup/etc-$time.tar.gz /etc/
#用于查找 /backup/ 目录下超过 30 天的 .tar.gz 格式备份文件并删除,以清理旧备份。
find /backup -type f -name "*.tar.gz" -mtime +30 |xargs rm -f
1.6 定时任务注意事项
1)增加注释
书写定时任务的时候,尽量添加上一个注释。用于说明这条定时任务作用。
2)尽量使用脚本
定时任务未来避免一些故障,推荐使用脚本。
调试脚本的方法:sh -x 或 bash -x,显示脚本执行过程。
有 + 开头的表示脚本背后执行的过程。如果开头没有 +,表示输出。
[root@oldboy-85-vip-king-v2 scripts]# sh -x backup-conf.sh
++ date +%F
+ tar zcf /backup/etc-2022-12-30.tar.gz /etc/
tar: 从成员名中删除开头的“/”
输出中 ++ 表示这是一个子命令(命令替换),即脚本中可能用了 date +%F 或 $(date +%F) 来获取日期并赋值给变量。
3)定时任务的文件脚本使用绝对路径
书写定时任务的时候,相关文件要使用绝对路径。
1 /server/scripts/backup-etc.sh
4)命令使用绝对路径
- 定时任务中直接写命令,可以加上绝对路径。参考 2.2-2)方案ⓐ
- 定时任务中运行脚本,脚本开头可以重新设置 PATH 环境变量。参考 2.2-2)方案ⓑ
5)定时任务中执行的命令或脚本定向到空或追加到文件
#定向到空
#1. 同步时间 by lidao996 at 20221111
*/2 * * * * /sbin/ntpdate ntp1.aliyun.com >/dev/null 2>&1
#追加到文件
#4. echo
* * * * * echo oldboy >>/tmp/lidao.txt 2>&1
#2. 定时备份 /etc/ 目录 by lidao996 at xxxx
00 01 * * * /bin/sh -x /server/scripts/backup-etc.sh >>/tmp/script.log 2>&1
1.7 定时任务故障案例
1)定时任务直接书写的时候 % 有特殊含义
- % 回车。
- 去掉特殊含义需要使用 \
1 如果使用脚本,就没有这个问题了。
2)定时任务关于命令路径的故障
在定时任务运行命令或脚本的时候,只能识别到 /bin 或 /usr/bin 目录下面的命令。
只要不在这些目录下面的命令,就要使用绝对路径或者重新定义下 PATH 环境变量。
故障案例:
现象:命令行执行命令或脚本是成功的,交到了定时任务中执行,提示命令找不到。
原因:定时任务运行脚本的时候或命令的时候,只能识别 /bin 和 /usr/bin 目录下面的命令。其他的命令无法识别。
解决方案:
Ⓐ 简单粗暴,遇到这种命令,直接写绝对路径。
Ⓑ 治本,在脚本开头 重新定义下 PATH 环境变量或重新加载下 PATH 环境变量。
定时任务识别的命令的路径:
PATH linux 环境变量,存放命令的位置。指定系统在哪些目录中查找可执行命令
linux 会在 PATH 路径中查找,如果有则执行。如果没有提示 command not found/no such file or directory
定时任务(比如 cron 任务)的执行环境,默认的 PATH 可能比较 “精简”(通常只包含 /bin、/usr/bin 等少数几个目录),这就导致一些在命令行中能正常执行的命令(因为命令行的 PATH 可能包含更多目录),在定时任务中执行时,由于 PATH 里没有命令所在的目录,会出现 “命令找不到” 的错误。
- 使用解决方案Ⓐ
1 [root@oldboy-aliyun-servers ~]# cat /server/scripts/test-info.sh
2 #!/bin/bash
3
4 hostname
5 /sbin/ip a s eth0
- 使用解决方案Ⓑ 重新定义 PATH
1 [root@oldboy-aliyun-servers ~]# cat /server/scripts/test-info.sh
2 #!/bin/bash
3 export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
4 hostname
5 ip a s eth0
- 使用解决方案Ⓑ 重新加载 PATH 变量
1 [root@oldboy-aliyun-servers ~]# cat /server/scripts/test-info.sh
2 #!/bin/bash
3 source /etc/profile #重新加载PATH环境变量
4 hostname
5 ip a s eth0
3)定时任务没有定向到空或追加到文件故障案例
现象:
邮件服务开启:不断收到邮箱 You have new mail in /var/spool/mail/root
邮件服务关闭:一些邮件的临时目录不断堆积小文件. /var/spool/postfix/maildrop
原因:
定时任务运行命令或脚本的时候,命令或脚本有输出,定时任务就会通过邮件形式发送给 root.
解决:
定时任务中命令或脚本定向到空或追加到文件.
#定向到空
#1. 同步时间 by lidao996 at 20221111
*/2 * * * * /sbin/ntpdate ntp1.aliyun.com &>/dev/null
#追加到文件
#4. echo
* * * * * echo oldboy >>/tmp/lidao.txt 2>&1
#2. 定时备份 /etc/ 目录 by lidao996 at xxxx
00 01 * * * /bin/sh -x /server/scripts/backup-etc.sh &>>/tmp/script.log
1.8 使用案例
1)定时备份 /etc/ 目录到 /backup 以 ip 地址命名的目录中
- 书写脚本 + 变量
- 取出 ip 存放变量 ✔️
- 取出时间存放到变量 ✔️
- 创建以 ip 命名目录 ✔️
- 打包压缩存放到这个 ip 地址命名的目录中,压缩包加上时间 ✔️
- 书写定时任务(每分钟)
- 书写定时任务(改为指定时间)
#!/bin/bash
#author: lidao996
#desc: backup etc add ip
#version: v1.0-beta
#变量
ip=`hostname -I|awk '{print $1}'`
time=`date +%F_%w`
#dir=/backup/$ip
#full_file=$dir/etc-$time.tar.gz
#操作
mkdir -p /backup/$ip
tar zcf /backup/$ip/etc-$time.tar.gz /etc/

浙公网安备 33010602011771号