Appearance
定时任务介绍
定时任务(Cron Job)用于在特定时间、间隔周期自动执行某些任务,例如:
- 定时备份数据(如 tar 打包)
- 定时清理日志
- 定时同步时间
- 定时运行监控任务
- 定时运行用户自定义脚本
2定时任务配置
定时任务的配置有两种方式:
- 系统级定时任务(适用于所有用户):编辑
/etc/crontab
- 用户级定时任务(仅适用于当前用户):使用
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) 任务日志记录
建议将 stdout
和 stderr
重定向到日志文件,方便排错:
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/cron | Crontab 运行日志 |
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. 总结
- 定时任务格式:
*
代表“每”/
代表“间隔”,
代表“多个”-
代表“范围”
- 系统任务和用户任务
/etc/crontab
(需指定用户)crontab -e
(当前用户)
- 路径问题
- 使用绝对路径,或者手动定义
PATH
- 使用绝对路径,或者手动定义
- 日志调试
- 使用
>> /var/log/mycron.log 2>&1
- 使用
- 编写脚本
- 定时任务复杂时,尽量写入 shell 脚本,再执行脚本。