定时任务详解

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/ 系统定时任务,每个月运行。
  • 检查是否运行
    image

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
  • 检查日志与结果

image

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

image

  • 定时任务 - 调试完成后改为指定的时间运行
#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/
posted @ 2025-10-02 21:49  gzjwo  阅读(24)  评论(0)    收藏  举报