三股水
Crontab 定时任务完整教程
本文从 Obsidian 撰写发布

Crontab 定时任务完整教程

一、什么是 Crontab

Crontab 是 Linux/Unix 系统下的定时任务工具,用于在指定的时间自动执行命令或脚本。它非常适合用于自动备份、数据同步、定期清理等重复性工作。


二、Crontab 基本命令

2.1 查看定时任务

crontab -l

列出当前用户的所有定时任务。

2.2 编辑定时任务

crontab -e

编辑当前用户的定时任务。第一次使用会提示选择编辑器(建议选 nanovim)。

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>&1

5.2 每天凌晨 3 点备份数据库

0 3 * * * /usr/bin/mysqldump -u root -p123456 mydb > /backup/db_$(date +\%Y\%m\%d).sql

5.3 每小时清理一次临时文件

0 * * * * find /tmp -type f -mtime +1 -delete

5.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 -20

7.2 查看自定义脚本日志

tail -f /var/log/running_page.log

7.3 手动执行脚本测试

/wwwroot/running_page_official/running_page/update.sh

7.4 查看脚本执行时间

ls -la /wwwroot/running_page_official/running_page/src/static/activities.json

看文件修改时间是否与定时任务设置的时间一致。


八、注意事项

  1. 使用绝对路径:Cron 执行时的环境变量与登录 Shell 不同,建议命令和脚本路径都用绝对路径。
  2. 日志重定向:建议将输出重定向到日志文件,方便排查问题:

    0 3 * * * /path/to/script.sh >> /var/log/script.log 2>&1
  3. 脚本添加执行权限

    chmod +x /path/to/update.sh
  4. 修改后无需重启:Cron 会自动检测到 crontab 文件的修改。
  5. 环境变量问题:在脚本开头手动添加 PATH 或使用绝对路径执行命令。
  6. 时区问题:定时任务时间基于系统时区,可用 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 -
😊
提交