cron
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
Chinese定时任务管理
定时任务管理
概述
概述
Cron 定时任务配置、日志监控、故障排查等技能。
Cron 定时任务配置、日志监控、故障排查等技能。
Crontab 基础
Crontab 基础
管理命令
管理命令
bash
undefinedbash
undefined编辑当前用户的 crontab
编辑当前用户的 crontab
crontab -e
crontab -e
查看当前用户的 crontab
查看当前用户的 crontab
crontab -l
crontab -l
删除当前用户的 crontab
删除当前用户的 crontab
crontab -r
crontab -r
管理其他用户的 crontab(需要 root)
管理其他用户的 crontab(需要 root)
crontab -u username -e
crontab -u username -l
undefinedcrontab -u username -e
crontab -u username -l
undefined时间格式
时间格式
┌───────────── 分钟 (0-59)
│ ┌───────────── 小时 (0-23)
│ │ ┌───────────── 日 (1-31)
│ │ │ ┌───────────── 月 (1-12)
│ │ │ │ ┌───────────── 星期 (0-7, 0和7都是周日)
│ │ │ │ │
* * * * * command┌───────────── 分钟 (0-59)
│ ┌───────────── 小时 (0-23)
│ │ ┌───────────── 日 (1-31)
│ │ │ ┌───────────── 月 (1-12)
│ │ │ │ ┌───────────── 星期 (0-7, 0和7都是周日)
│ │ │ │ │
* * * * * command特殊字符
特殊字符
bash
* # 任意值
, # 列表 (1,3,5)
- # 范围 (1-5)
/ # 步长 (*/5 每5分钟)bash
* # 任意值
, # 列表 (1,3,5)
- # 范围 (1-5)
/ # 步长 (*/5 每5分钟)示例
示例
0 * * * * # 每小时整点
*/15 * * * * # 每15分钟
0 9-17 * * * # 9点到17点每小时
0 0 * * 1-5 # 工作日零点
0 0 1,15 * * # 每月1号和15号零点
undefined0 * * * * # 每小时整点
*/15 * * * * # 每15分钟
0 9-17 * * * # 9点到17点每小时
0 0 * * 1-5 # 工作日零点
0 0 1,15 * * # 每月1号和15号零点
undefined特殊时间字符串
特殊时间字符串
bash
@reboot # 系统启动时
@yearly # 每年 (0 0 1 1 *)
@monthly # 每月 (0 0 1 * *)
@weekly # 每周 (0 0 * * 0)
@daily # 每天 (0 0 * * *)
@hourly # 每小时 (0 * * * *)bash
@reboot # 系统启动时
@yearly # 每年 (0 0 1 1 *)
@monthly # 每月 (0 0 1 * *)
@weekly # 每周 (0 0 * * 0)
@daily # 每天 (0 0 * * *)
@hourly # 每小时 (0 * * * *)配置文件
配置文件
用户 crontab
用户 crontab
bash
undefinedbash
undefined位置
位置
/var/spool/cron/crontabs/username # Debian/Ubuntu
/var/spool/cron/username # CentOS/RHEL
/var/spool/cron/crontabs/username # Debian/Ubuntu
/var/spool/cron/username # CentOS/RHEL
格式
格式
SHELL=/bin/bash
PATH=/usr/local/bin:/usr/bin:/bin
MAILTO=admin@example.com
SHELL=/bin/bash
PATH=/usr/local/bin:/usr/bin:/bin
MAILTO=admin@example.com
任务
任务
0 2 * * * /usr/local/bin/backup.sh
undefined0 2 * * * /usr/local/bin/backup.sh
undefined系统 crontab
系统 crontab
bash
undefinedbash
undefined/etc/crontab
/etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
格式:多了用户字段
格式:多了用户字段
分 时 日 月 周 用户 命令
分 时 日 月 周 用户 命令
0 2 * * * root /usr/local/bin/backup.sh
undefined0 2 * * * root /usr/local/bin/backup.sh
undefinedcron.d 目录
cron.d 目录
bash
undefinedbash
undefined/etc/cron.d/myapp
/etc/cron.d/myapp
SHELL=/bin/bash
PATH=/usr/local/bin:/usr/bin:/bin
0 * * * * appuser /opt/myapp/hourly-task.sh
0 2 * * * root /opt/myapp/daily-backup.sh
undefinedSHELL=/bin/bash
PATH=/usr/local/bin:/usr/bin:/bin
0 * * * * appuser /opt/myapp/hourly-task.sh
0 2 * * * root /opt/myapp/daily-backup.sh
undefined预定义目录
预定义目录
bash
/etc/cron.hourly/ # 每小时执行
/etc/cron.daily/ # 每天执行
/etc/cron.weekly/ # 每周执行
/etc/cron.monthly/ # 每月执行bash
/etc/cron.hourly/ # 每小时执行
/etc/cron.daily/ # 每天执行
/etc/cron.weekly/ # 每周执行
/etc/cron.monthly/ # 每月执行放入可执行脚本即可
放入可执行脚本即可
chmod +x /etc/cron.daily/myscript
undefinedchmod +x /etc/cron.daily/myscript
undefined最佳实践
最佳实践
脚本模板
脚本模板
bash
#!/bin/bashbash
#!/bin/bash/usr/local/bin/cron-task.sh
/usr/local/bin/cron-task.sh
日志文件
日志文件
LOG_FILE="/var/log/cron-task.log"
LOG_FILE="/var/log/cron-task.log"
锁文件(防止重复执行)
锁文件(防止重复执行)
LOCK_FILE="/var/run/cron-task.lock"
LOCK_FILE="/var/run/cron-task.lock"
检查锁
检查锁
if [ -f "$LOCK_FILE" ]; then
echo "$(date): Task already running" >> "$LOG_FILE"
exit 1
fi
if [ -f "$LOCK_FILE" ]; then
echo "$(date): Task already running" >> "$LOG_FILE"
exit 1
fi
创建锁
创建锁
trap "rm -f $LOCK_FILE" EXIT
touch "$LOCK_FILE"
trap "rm -f $LOCK_FILE" EXIT
touch "$LOCK_FILE"
记录开始
记录开始
echo "$(date): Task started" >> "$LOG_FILE"
echo "$(date): Task started" >> "$LOG_FILE"
执行任务
执行任务
/path/to/actual/command >> "$LOG_FILE" 2>&1
EXIT_CODE=$?
/path/to/actual/command >> "$LOG_FILE" 2>&1
EXIT_CODE=$?
记录结束
记录结束
echo "$(date): Task finished with exit code $EXIT_CODE" >> "$LOG_FILE"
exit $EXIT_CODE
undefinedecho "$(date): Task finished with exit code $EXIT_CODE" >> "$LOG_FILE"
exit $EXIT_CODE
undefinedCrontab 条目
Crontab 条目
bash
undefinedbash
undefined推荐写法
推荐写法
1. 使用绝对路径
1. 使用绝对路径
2. 重定向输出
2. 重定向输出
3. 添加注释
3. 添加注释
每日备份 - 凌晨2点
每日备份 - 凌晨2点
0 2 * * * /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1
0 2 * * * /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1
每5分钟健康检查
每5分钟健康检查
*/5 * * * * /usr/local/bin/healthcheck.sh > /dev/null 2>&1
*/5 * * * * /usr/local/bin/healthcheck.sh > /dev/null 2>&1
每周日志清理 - 周日凌晨3点
每周日志清理 - 周日凌晨3点
0 3 * * 0 /usr/local/bin/cleanup-logs.sh >> /var/log/cleanup.log 2>&1
undefined0 3 * * 0 /usr/local/bin/cleanup-logs.sh >> /var/log/cleanup.log 2>&1
undefined环境变量
环境变量
bash
undefinedbash
undefined在 crontab 中设置
在 crontab 中设置
SHELL=/bin/bash
PATH=/usr/local/bin:/usr/bin:/bin
HOME=/home/user
MAILTO=admin@example.com
SHELL=/bin/bash
PATH=/usr/local/bin:/usr/bin:/bin
HOME=/home/user
MAILTO=admin@example.com
或在脚本中加载
或在脚本中加载
#!/bin/bash
source /etc/profile
source ~/.bashrc
undefined#!/bin/bash
source /etc/profile
source ~/.bashrc
undefined日志与监控
日志与监控
查看日志
查看日志
bash
undefinedbash
undefined系统日志
系统日志
grep CRON /var/log/syslog # Debian/Ubuntu
grep CRON /var/log/cron # CentOS/RHEL
grep CRON /var/log/syslog # Debian/Ubuntu
grep CRON /var/log/cron # CentOS/RHEL
实时监控
实时监控
tail -f /var/log/syslog | grep CRON
tail -f /var/log/syslog | grep CRON
查看邮件(如果配置了 MAILTO)
查看邮件(如果配置了 MAILTO)
cat /var/mail/username
undefinedcat /var/mail/username
undefined调试技巧
调试技巧
bash
undefinedbash
undefined手动测试脚本
手动测试脚本
/usr/local/bin/myscript.sh
/usr/local/bin/myscript.sh
模拟 cron 环境
模拟 cron 环境
env -i /bin/bash --noprofile --norc -c '/usr/local/bin/myscript.sh'
env -i /bin/bash --noprofile --norc -c '/usr/local/bin/myscript.sh'
检查 cron 服务状态
检查 cron 服务状态
systemctl status cron # Debian/Ubuntu
systemctl status crond # CentOS/RHEL
undefinedsystemctl status cron # Debian/Ubuntu
systemctl status crond # CentOS/RHEL
undefined常见场景
常见场景
场景 1:数据库备份
场景 1:数据库备份
bash
undefinedbash
undefined每天凌晨2点备份 MySQL
每天凌晨2点备份 MySQL
0 2 * * * /usr/bin/mysqldump -u root -p'password' database | gzip > /backup/db_$(date +%Y%m%d).sql.gz
0 2 * * * /usr/bin/mysqldump -u root -p'password' database | gzip > /backup/db_$(date +%Y%m%d).sql.gz
注意:% 需要转义为 %
注意:% 需要转义为 %
undefinedundefined场景 2:日志轮转
场景 2:日志轮转
bash
undefinedbash
undefined每天压缩并清理7天前的日志
每天压缩并清理7天前的日志
0 0 * * * find /var/log/myapp -name ".log" -mtime +7 -delete
0 1 * * * gzip /var/log/myapp/.log.1
undefined0 0 * * * find /var/log/myapp -name ".log" -mtime +7 -delete
0 1 * * * gzip /var/log/myapp/.log.1
undefined场景 3:监控告警
场景 3:监控告警
bash
undefinedbash
undefined每5分钟检查服务状态
每5分钟检查服务状态
*/5 * * * * /usr/local/bin/check-service.sh || /usr/local/bin/send-alert.sh
undefined*/5 * * * * /usr/local/bin/check-service.sh || /usr/local/bin/send-alert.sh
undefined场景 4:使用 flock 防止重复
场景 4:使用 flock 防止重复
bash
undefinedbash
undefined使用 flock 确保单实例运行
使用 flock 确保单实例运行
*/5 * * * * /usr/bin/flock -n /var/lock/mytask.lock /usr/local/bin/mytask.sh
undefined*/5 * * * * /usr/bin/flock -n /var/lock/mytask.lock /usr/local/bin/mytask.sh
undefined故障排查
故障排查
| 问题 | 排查方法 |
|---|---|
| 任务不执行 | 检查 cron 服务状态、日志 |
| 权限错误 | 检查脚本权限、用户权限 |
| 环境变量问题 | 在脚本中设置 PATH |
| 命令找不到 | 使用绝对路径 |
| 输出丢失 | 重定向到日志文件 |
bash
undefined| 问题 | 排查方法 |
|---|---|
| 任务不执行 | 检查 cron 服务状态、日志 |
| 权限错误 | 检查脚本权限、用户权限 |
| 环境变量问题 | 在脚本中设置 PATH |
| 命令找不到 | 使用绝对路径 |
| 输出丢失 | 重定向到日志文件 |
bash
undefined检查 cron 服务
检查 cron 服务
systemctl status cron
systemctl status cron
检查用户是否被禁止
检查用户是否被禁止
cat /etc/cron.allow
cat /etc/cron.deny
cat /etc/cron.allow
cat /etc/cron.deny
检查语法
检查语法
crontab -l | grep -v '^#' | while read line; do
echo "Checking: $line"
done
undefinedcrontab -l | grep -v '^#' | while read line; do
echo "Checking: $line"
done
undefined