Skip to content

定时任务介绍

定时任务(Cron Job)用于在特定时间、间隔周期自动执行某些任务,例如:

  • 定时备份数据(如 tar 打包)
  • 定时清理日志
  • 定时同步时间
  • 定时运行监控任务
  • 定时运行用户自定义脚本

2定时任务配置

定时任务的配置有两种方式:

  1. 系统级定时任务(适用于所有用户):编辑 /etc/crontab
  2. 用户级定时任务(仅适用于当前用户):使用 crontab -e

定时任务的时间格式

plain
plaintext


复制编辑
*  *  *  *  *  命令
|  |  |  |  |
|  |  |  |  └── 周 (0-7) 0和7都表示星期天
|  |  |  └──── 月 (1-12)
|  |  └────── 日 (1-31)
|  └──────── 时 (0-23)
└────────── 分 (0-59)

示例

表达式含义
* * * * *每分钟执行一次
*/5 * * * *每 5 分钟执行一次
0 * * * *每小时的 0 分钟执行(整点)
0 3 * * *每天凌晨 3 点执行
0 3 * * 1-5每周一到周五的凌晨 3 点执行
0 7,10 * * *每天早上 7 点和 10 点执行
*/30 * * * *每 30 分钟执行一次

Crontab 命令

(1) 查看当前用户的定时任务

plain
crontab -l

示例输出:

plain
0 3 * * * /root/backup.sh

表示每天凌晨 3 点执行 /root/backup.sh 脚本。

(2) 编辑定时任务

plain
crontab -e
  • 进入定时任务编辑模式,编辑的是 /var/spool/cron/用户名
  • 不需要指定用户,直接写命令

(3) 删除当前用户的定时任务

plain

crontab -r

注意:删除后无法恢复,建议使用 crontab -l > backup.txt 先备份。

(4) 仅删除某个定时任务

先使用 crontab -e 进入编辑模式,删除不需要的行即可。


Crontab 示例

(1) 每分钟追加一行文本到 name.txt

plain
* * * * * echo "oldboyedu" >> ~/name.txt

(2) 每 5 分钟执行一次命令

plain
*/5 * * * * echo "Hello World" >> /tmp/test.log

(3) 每个小时的第 5 分钟执行

plain
5 * * * * /root/script.sh

(4) 每间隔 2 小时执行

plain
0 */2 * * * /root/script.sh

(5) 每天凌晨 12 点执行

plain
0 0 * * * /root/script.sh

(6) 仅在周一至周五的凌晨 3 点执行

plain
0 3 * * 1-5 /root/script.sh

(7) 在每天 10 点到 12 点,14 点到 17 点整点执行

plain
0 10-12,14-17 * * * /root/script.sh

5. 注意事项

(1) % 符号

Crontab 任务中的 % 需要转义:

plain
* * * * * mkdir /opt/$(date +\%F)

或者写成脚本:

plain
#!/bin/bash
mkdir /opt/$(date +%F)

然后定时执行脚本:

plain
* * * * * sh /root/myscript.sh

(2) 使用绝对路径

Crontab 默认 PATH 变量不包含所有路径,建议使用绝对路径:

plain
* * * * * /usr/bin/python3 /root/myscript.py

或者在 crontab 文件顶部定义 PATH

plain
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/bin

(3) 任务日志记录

建议将 stdoutstderr 重定向到日志文件,方便排错:

plain
sh


复制编辑
* * * * * /root/myscript.sh >> /var/log/myscript.log 2>&1

(4) 执行 Shell 脚本时的方式

plain
sh


复制编辑
* * * * * /root/myscript.sh   # 需要可执行权限 chmod +x myscript.sh
* * * * * sh /root/myscript.sh # 无需可执行权限

6. 相关配置文件

文件路径作用
/etc/crontab系统级定时任务文件
/var/spool/cron/用户名当前用户的定时任务
/var/log/cronCrontab 运行日志

7. 实践

(1) 每天凌晨 3 点

  • 创建一个目录,目录名包含时间(精确到秒)+ IP + 主机名
  • 备份 /etc/passwd/etc/hosts 到该目录
plain
0 3 * * * /root/backup.sh

backup.sh 内容

plain
#!/bin/bash
dir="/opt/$(date +%F-%H-%M-%S)_$(hostname -I | awk '{print $1}')_$(hostname)"
mkdir -p "$dir"
tar zcf "$dir/all.tar.gz" /etc/passwd /etc/hosts

给脚本添加执行权限:

plain
chmod +x /root/backup.sh

(2) 每天凌晨 4 点注释掉凌晨 3 点的任务

plain
0 4 * * * sed -i 's/^0 3 \* \* \* /#0 3 * * * /' /var/spool/cron/root

8. 总结

  1. 定时任务格式:
    • * 代表“每”
    • / 代表“间隔”
    • , 代表“多个”
    • - 代表“范围”
  2. 系统任务和用户任务
    • /etc/crontab(需指定用户)
    • crontab -e(当前用户)
  3. 路径问题
    • 使用绝对路径,或者手动定义 PATH
  4. 日志调试
    • 使用 >> /var/log/mycron.log 2>&1
  5. 编写脚本
    • 定时任务复杂时,尽量写入 shell 脚本,再执行脚本。

感谢阅读,欢迎交流!