本文从 Obsidian 撰写发布
Crontab 定时任务完整教程
一、什么是 Crontab
Crontab 是 Linux/Unix 系统下的定时任务工具,用于在指定的时间自动执行命令或脚本。它非常适合用于自动备份、数据同步、定期清理等重复性工作。
二、Crontab 基本命令
2.1 查看定时任务
crontab -l列出当前用户的所有定时任务。
2.2 编辑定时任务
crontab -e编辑当前用户的定时任务。第一次使用会提示选择编辑器(建议选 nano 或 vim)。
2.3 删除所有定时任务
crontab -r删除当前用户的所有定时任务(慎用)。
2.4 查看其他用户的定时任务
crontab -u 用户名 -l需要 root 权限才能查看其他用户的定时任务。
2.5 重新加载 crontab
service cron reload修改定时任务后,通常会自动生效,不需要手动重启。
三、Crontab 时间格式
* * * * * 要执行的命令
│ │ │ │ │
│ │ │ │ └─── 星期几 (0-7, 0和7都代表周日)
│ │ │ └───── 月份 (1-12)
│ │ └─────── 日期 (1-31)
│ └───────── 小时 (0-23)
└─────────── 分钟 (0-59)3.1 特殊字符说明
| 字符 | 含义 | 示例 |
|---|---|---|
* | 任意值 | 0 * * * * 每小时执行 |
*/n | 每隔 n 单位执行 | */5 * * * * 每 5 分钟执行 |
, | 列举多个值 | 0 9,18 * * * 每天 9 点和 18 点执行 |
- | 范围 | 0 9-17 * * * 每天 9 点到 17 点每小时执行 |
/ | 步长 | */10 * * * * 每 10 分钟执行 |
四、常用时间示例
| 表达式 | 含义 |
|---|---|
0 3 * * * | 每天凌晨 3:00 执行一次 |
0 */2 * * * | 每 2 小时执行一次(0 点、2 点、4 点...) |
*/30 * * * * | 每 30 分钟执行一次 |
0 9,18 * * * | 每天上午 9 点和下午 6 点执行 |
0 9 * * 1 | 每周一上午 9 点执行 |
0 0 1 * * | 每月 1 号凌晨 0 点执行 |
0 0 1 1 * | 每年 1 月 1 日凌晨 0 点执行 |
* * * * * | 每分钟执行一次(慎用) |
五、实战案例
5.1 每 2 小时同步 Keep 数据并更新网站
0 */2 * * * cd /wwwroot/running_page_official/running_page && ./update.sh >> /var/log/running_page.log 2>&15.2 每天凌晨 3 点备份数据库
0 3 * * * /usr/bin/mysqldump -u root -p123456 mydb > /backup/db_$(date +\%Y\%m\%d).sql5.3 每小时清理一次临时文件
0 * * * * find /tmp -type f -mtime +1 -delete5.4 每天检查服务器状态
0 8 * * * /usr/bin/curl -s http://localhost/health > /dev/null || /usr/bin/systemctl restart nginx六、添加定时任务的方式
6.1 方式一:使用 crontab -e 编辑
crontab -e在打开的编辑器中添加一行任务,保存退出。
6.2 方式二:用 echo 直接添加(不覆盖已有任务)
(crontab -l 2>/dev/null | grep -v "任务关键字"; echo "0 3 * * * /path/to/script.sh") | crontab -6.3 方式三:从文件导入
crontab /path/to/cronfile七、日志查看与调试
7.1 查看 Cron 执行日志
tail -f /var/log/syslog | grep CRON或
grep CRON /var/log/syslog | tail -207.2 查看自定义脚本日志
tail -f /var/log/running_page.log7.3 手动执行脚本测试
/wwwroot/running_page_official/running_page/update.sh7.4 查看脚本执行时间
ls -la /wwwroot/running_page_official/running_page/src/static/activities.json看文件修改时间是否与定时任务设置的时间一致。
八、注意事项
- 使用绝对路径:Cron 执行时的环境变量与登录 Shell 不同,建议命令和脚本路径都用绝对路径。
日志重定向:建议将输出重定向到日志文件,方便排查问题:
0 3 * * * /path/to/script.sh >> /var/log/script.log 2>&1脚本添加执行权限:
chmod +x /path/to/update.sh- 修改后无需重启:Cron 会自动检测到
crontab文件的修改。 - 环境变量问题:在脚本开头手动添加
PATH或使用绝对路径执行命令。 - 时区问题:定时任务时间基于系统时区,可用
date命令查看当前系统时间。
九、验证定时任务是否成功
# 1. 查看定时任务是否存在
crontab -l | grep update.sh
# 2. 查看执行日志
tail -20 /var/log/running_page.log
# 3. 查看数据文件更新时间
ls -la /wwwroot/running_page_official/running_page/src/static/activities.json
# 4. 手动触发测试
/wwwroot/running_page_official/running_page/update.sh十、常用 Cron 模板
# 每天凌晨 3 点执行
0 3 * * * /path/to/script.sh
# 每 2 小时执行
0 */2 * * * /path/to/script.sh
# 每 30 分钟执行
*/30 * * * * /path/to/script.sh
# 每周一凌晨 3 点执行
0 3 * * 1 /path/to/script.sh
# 每月 1 号凌晨 3 点执行
0 3 1 * * /path/to/script.sh
# 每天上午 9 点和下午 6 点执行
0 9,18 * * * /path/to/script.sh
# 工作日(周一到周五)凌晨 3 点执行
0 3 * * 1-5 /path/to/script.sh
# 每小时执行一次(每小时的 15 分)
15 * * * * /path/to/script.sh
# 每天凌晨 3 点执行,带日志
0 3 * * * cd /wwwroot/project && ./update.sh >> /var/log/project.log 2>&1十一、快速添加命令
11.1 每 2 小时执行一次
(crontab -l 2>/dev/null | grep -v update.sh; echo "0 */2 * * * cd /wwwroot/running_page_official/running_page && ./update.sh >> /var/log/running_page.log 2>&1") | crontab -11.2 每天凌晨 3 点执行一次
(crontab -l 2>/dev/null | grep -v update.sh; echo "0 3 * * * cd /wwwroot/running_page_official/running_page && ./update.sh >> /var/log/running_page.log 2>&1") | crontab -11.3 每小时执行一次
(crontab -l 2>/dev/null | grep -v update.sh; echo "0 * * * * cd /wwwroot/running_page_official/running_page && ./update.sh >> /var/log/running_page.log 2>&1") | crontab -