谷粒的泥坑

🌿谷粒的生活笔记 —— 在数字世界的泥坑中,播种代码、文字的种子,静待每一份热爱自然生长

crontab的用法整理

crontab 是 Linux/Unix 系统中用于设置定时任务的工具,可以让系统在指定时间自动执行脚本或命令。以下是 详细用法指南,包括基础语法、配置方法、调试技巧和实际示例。


一、基本语法

  1. crontab 文件格式
    每个定时任务占一行,格式如下:
1
2
3
4
5
6
7
* * * * * command_to_execute
│ │ │ │ │
│ │ │ │ └── 星期几 (0-6, 0=周日)
│ │ │ └──── 月份 (1-12)
│ │ └────── 日 (1-31)
│ └──────── 小时 (0-23)
└────────── 分钟 (0-59)
  1. 特殊符号
    符号 说明 示例
    * 任意值(每分钟/每小时等) * * * * * → 每分钟执行
    , 指定多个时间点 0,15,30 * * * * → 每小时的 0、15、30 分执行
    - 时间范围 0 9-17 * * * → 每天 9 点到 17 点整点执行
    / 间隔时间 */5 * * * * → 每 5 分钟执行

二、常用操作

  1. 编辑 crontab
1
crontab -e  # 编辑当前用户的定时任务

(首次使用会提示选择编辑器,推荐 nanovim

  1. 查看 crontab
1
crontab -l  # 列出当前用户的定时任务
  1. 删除 crontab
1
crontab -r  # 删除所有定时任务(谨慎使用!)
  1. 指定用户
1
crontab -u username -e  # 编辑指定用户的定时任务(需 root 权限)

三、实际示例

  1. 每天凌晨 4 点执行备份脚本
1
0 4 * * * /bin/bash /path/to/backup_script.sh
  1. 每小时的第 5 分钟执行
1
5 * * * * /usr/bin/python3 /path/to/script.py
  1. 每周一 8:30 发送邮件
1
30 8 * * 1 /usr/sbin/sendmail user@example.com < /tmp/report.txt
  1. 每 10 分钟检查服务
1
*/10 * * * * /usr/bin/systemctl check nginx
  1. 每月 1 号凌晨 3 点清理日志
1
0 3 1 * * /bin/rm -rf /var/log/nginx/*.log

四、环境变量问题
cron 默认环境与终端不同,可能导致脚本执行失败。解决方法:

  1. 指定完整路径
1
0 * * * * /usr/bin/curl https://example.com/api/ping
  1. 在 crontab 中加载环境
1
2
3
4
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

0 * * * * source ~/.bashrc && /path/to/script.sh
  1. 在脚本内设置环境
1
2
3
#!/bin/bash
export PATH=/usr/local/bin:$PATH
# 后续命令...

五、日志与调试

  1. 查看 cron 执行日志
1
2
tail -f /var/log/syslog | grep cron  # Ubuntu/Debian
tail -f /var/log/cron # CentOS/RHEL
  1. 重定向输出到文件
1
0 * * * * /path/to/script.sh >> /var/log/cron.log 2>&1

>> 追加日志

2>&1 将错误输出和标准输出合并

  1. 测试 cron 任务
1
2
3
4
5
# 手动运行脚本,确保无报错
/bin/bash /path/to/script.sh

# 强制立即执行一次(仅适用于某些系统)
crontab -l | grep -v "^#" | cut -f 6- -d " " | while read cmd; do eval $cmd; done

六、注意事项

  1. 脚本权限
    1
    chmod +x /path/to/script.sh  # 确保可执行
  2. 避免频繁任务
    * * * * *(每分钟)可能对系统造成负担,建议至少间隔 5 分钟(*/5 * * * *)。
  3. 依赖问题
    如果脚本依赖 GUI 或 DISPLAY,需额外配置:
    1
    * * * * * export DISPLAY=:0 && /path/to/gui_script.sh
  4. 容器环境
    在 Docker 中建议使用 supervisord 或直接通过 CMD 运行脚本。

七、高级用法

  1. 随机延迟(避免任务集中执行)
1
2
# 每天 3 点随机延迟 0-300 秒执行
0 3 * * * sleep $((RANDOM\%300)) && /path/to/script.sh
  1. 锁机制(防止重复执行)
1
*/10 * * * * flock -n /tmp/backup.lock -c "/path/to/backup.sh"
  1. 邮件通知
1
2
MAILTO="admin@example.com"
0 * * * * /path/to/monitor.sh

(任务输出会发送到指定邮箱)


总结

操作 命令
编辑定时任务 crontab -e
查看定时任务 crontab -l
删除所有任务 crontab -r
指定用户 crontab -u username -e
日志查看 tail -f /var/log/cron

掌握这些技巧后,你可以轻松实现 自动化备份、日志轮转、服务监控 等任务!