Linux crontab 超详细完整教程
一、基础概念crontab是 Linux 定时任务工具周期性执行命令/脚本依托系统守护进程crond运行默认开机自启。适用定时备份、日志清理、巡检、定时重启、数据同步不适用秒级定时crontab 最小单位为分钟秒级用 sleep、systemd-timer服务启停CentOS7/Ubuntu16# 查看状态 systemctl status crond # 启动、停止、重启 systemctl start crond systemctl stop crond systemctl restart crond # 开机自启 systemctl enable crond # 查看日志定时执行记录 tail -f /var/log/cron二、crontab 基础命令crontab -e # 编辑当前用户定时任务最常用 crontab -l # 列出当前用户所有定时任务 crontab -r # 删除当前用户全部定时任务慎用 crontab -u 用户名 -l/e/r # 操作指定用户任务root才可使用注意每个用户独立一份定时任务root 任务和普通用户互不干扰。三、定时表达式核心格式重中之重格式5个星号 要执行的命令* * * * * 执行命令 分 时 日 月 周位置含义取值范围第1位分钟0~59第2位小时0~23第3位日期1~31第4位月份1~12第5位星期0~70和7都代表周日特殊符号含义*任意时刻代表每* * * * *每分钟执行,多个不连续时间分隔0 8,12,18 * * *每天8、12、18点整执行-连续区间0 9-18 * * *9点~18点每小时整点执行/n每隔n单位执行一次*/5 * * * *每5分钟执行四、常用时间示例# 1. 每分钟执行 * * * * * command # 2. 每5分钟执行 */5 * * * * command # 3. 每小时整点执行 0 * * * * command # 4. 每天凌晨2点30分执行 30 2 * * * command # 5. 每周一早上9点整执行 0 9 * * 1 command # 6. 每月1号凌晨3点执行 0 3 1 * * command # 7. 每天9~18点每30分钟执行一次 */30 9-18 * * * # 8. 每周一、三、五 22点执行 0 22 * * 1,3,5五、标准使用模板模板1直接执行系统命令# 每天凌晨1点清理/tmp目录垃圾 0 1 * * * rm -rf /tmp/*模板2执行shell脚本生产最常用脚本必须加绝对路径脚本开头建议加#!/bin/bash必须给脚本执行权限chmod x xxx.sh# 每天凌晨2点执行备份脚本 0 2 * * * /home/back/backup.sh模板3输出日志排查报错必备crontab默认无终端必须手动重定向日志否则报错看不到# 正常输出错误 全部写入日志 0 2 * * * /home/back/backup.sh /home/back/run.log 21 # 只丢弃输出不打印日志 0 2 * * * /home/back/backup.sh /dev/null 21追加日志覆盖日志21标准错误 重定向到标准输出六、系统全局定时任务/etc/crontab用户级crontab -e只属于当前用户系统级/etc/crontab可指定执行用户格式多一列用户名分 时 日 月 周 用户 命令 0 3 * * * root /usr/bin/df -h系统内置定时目录开箱即用/etc/cron.minutely 每分钟 /etc/cron.hourly 每小时 /etc/cron.daily 每日 /etc/cron.weekly 每周 /etc/cron.monthly 每月把脚本放入对应目录自动定时运行无需写表达式。七、常见坑与避坑指南路径问题最高发错误crontab 环境变量极少所有命令、文件一律用绝对路径不要用cd、相对路径。错误sh backup.sh正确/home/back/backup.sh命令失效脚本无执行权限解决chmod x 脚本路径看不到报错没有日志重定向必须加 xxx.log 21查看运行异常。日期星期同时设定是或关系0 0 1 * 0每月1号 或 每周日 都会执行不是“每月1号且周日”。不要频繁大量IO定时任务避免磁盘打满。八、实用生产案例案例1每日凌晨3点数据库备份0 3 * * * /usr/bin/mysqldump -uroot -p123456 testdb /data/db_back/db_$(date \%Y\%m\%d).sql /data/db_back/back.log 21crontab中%有特殊含义日期命令里必须写成\%转义。案例2每10分钟检测nginx进程宕机自动重启*/10 * * * * pgrep nginx /dev/null || systemctl start nginx案例3每周日凌晨4点清理7天前日志0 4 * * 0 find /var/log/nginx -name *.log -mtime 7 -delete九、快捷定时符号语法简化写法替代5位表达式minute 每分钟 hourly 每小时0分 daily 每天0点 weekly 每周日0点 monthly 每月1号0点 reboot 开机执行1次示例开机执行脚本reboot /home/start.sh