1. Cron 简介
Cron 是 Linux 系统内置的定时任务调度器,用于在固定时间、日期或间隔执行预定的命令或脚本。
2. Cron 服务管理
服务启停
# 查看 cron 服务状态
sudo systemctl status cron # Debian/Ubuntu
sudo systemctl status crond # CentOS/RHEL
# 启动 cron 服务
sudo systemctl start cron
# 停止 cron 服务
sudo systemctl stop cron
# 重启 cron 服务
sudo systemctl restart cron
# 设置开机自启
sudo systemctl enable cron
检查服务是否运行
# 方法1:检查进程
ps aux | grep cron
# 方法2:检查服务状态
systemctl is-active cron
3. Cron 配置文件
系统级 Cron 文件
/etc/crontab # 系统定时任务配置文件
/etc/cron.d/ # 系统cron任务目录
/etc/cron.hourly/ # 每小时执行
/etc/cron.daily/ # 每天执行
/etc/cron.weekly/ # 每周执行
/etc/cron.monthly/ # 每月执行
用户级 Cron 文件
/var/spool/cron/crontabs/ # 用户cron文件存储位置(不建议直接编辑)
crontab -l # 查看当前用户的cron任务
4. Crontab 命令
基本操作
# 编辑当前用户的cron任务
crontab -e
# 查看当前用户的cron任务
crontab -l
# 删除当前用户的所有cron任务
crontab -r
# 编辑指定用户的cron任务(需要root权限)
crontab -u username -e
# 从文件恢复cron任务
crontab mycronfile.txt
安全配置
/etc/cron.allow # 允许使用cron的用户列表
/etc/cron.deny # 禁止使用cron的用户列表
5. Cron 时间格式详解
基本格式
* * * * * command_to_execute
- - - - -
| | | | |
| | | | +----- 星期几 (0 - 7) (0和7都代表周日)
| | | +---------- 月份 (1 - 12)
| | +--------------- 日期 (1 - 31)
| +-------------------- 小时 (0 - 23)
+------------------------- 分钟 (0 - 59)
特殊字符
| 字符 | 含义 | 示例 | 说明 |
|---|---|---|---|
* | 任意值 | * * * * * | 每分钟执行 |
, | 值分隔符 | 1,15 * * * * | 每小时的第1和第15分钟 |
- | 范围 | 1-5 * * * * | 每小时1-5分钟 |
/ | 步长 | */10 * * * * | 每10分钟 |
@ | 预设 | @daily | 每天执行 |
预设替代符
@reboot # 系统启动时执行
@yearly # 每年一次 (0 0 1 1 *)
@annually # 同 @yearly
@monthly # 每月一次 (0 0 1 * *)
@weekly # 每周一次 (0 0 * * 0)
@daily # 每天一次 (0 0 * * *)
@hourly # 每小时一次 (0 * * * *)
6. 常用时间配置示例
分钟级任务
* * * * * command # 每分钟执行一次
*/5 * * * * command # 每5分钟执行一次
0,15,30,45 * * * * command # 每15分钟执行一次
小时级任务
0 * * * * command # 每小时整点执行一次
30 * * * * command # 每小时的30分执行一次
0 */2 * * * command # 每2小时执行一次
天级任务
0 2 * * * command # 每天凌晨2点执行一次
0 9,18 * * * command # 每天上午9点和下午6点执行一次
30 1 * * * command # 每天凌晨1点30分执行一次
周级任务
0 0 * * 0 command # 每周日午夜整点执行一次
0 12 * * 1 command # 每周一中午12点执行一次
0 3 * * 1-5 command # 周一到周五凌晨3点执行一次
月级任务
0 0 1 * * command # 每月1号午夜整点执行一次
0 6 15 * * command # 每月15号早上6点执行一次
0 0 1 1 * command # 每年1月1日午夜整点执行一次
7. 环境变量问题
常见问题
Cron 执行环境与用户登录环境不同,可能导致命令找不到。
解决方案
方法1:使用绝对路径
# 错误
* * * * * myscript.sh
# 正确
* * * * * /home/user/myscript.sh
方法2:在脚本中设置PATH
#!/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
# 你的命令...
方法3:在crontab中设置环境变量
# 在crontab文件开头设置
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOME=/home/username
LOGNAME=username
* * * * * /path/to/command
8. 输出处理
输出重定向
# 丢弃所有输出(不推荐)
* * * * * /path/to/command > /dev/null 2>&1
# 重定向到文件
* * * * * /path/to/command >> /var/log/mycommand.log 2>&1
# 标准输出和错误输出分开
* * * * * /path/to/command >> /var/log/stdout.log 2>> /var/log/stderr.log
邮件通知
# 禁用邮件通知(无输出时不发送)
* * * * * /path/to/command > /dev/null 2>&1
# 指定收件人(在crontab开头设置)
MAILTO="admin@example.com"
9. 实用技巧和最佳实践
调试技巧
# 1. 查看cron日志
sudo tail -f /var/log/syslog | grep cron # Debian/Ubuntu
sudo tail -f /var/log/cron # CentOS/RHEL
# 2. 测试环境变量
* * * * * env > /tmp/cron_env.txt
# 3. 测试命令执行
* * * * * /path/to/command >> /tmp/cron_debug.log 2>&1
最佳实践
- 使用完整路径:所有命令和文件都使用绝对路径
- 设置正确的PATH:在脚本或crontab中明确设置PATH
- 处理输出:合理重定向输出,避免填满磁盘
- 设置权限:确保脚本有执行权限
chmod +x script.sh - 测试脚本:先在命令行测试脚本,再添加到cron
- 添加注释:在crontab中添加注释说明任务用途
- 备份配置:定期备份crontab配置
错误排查清单
# 1. 检查脚本权限
ls -l /path/to/script.sh
# 2. 检查命令路径
which command_name
# 3. 检查cron服务状态
systemctl status cron
# 4. 查看cron日志
tail -f /var/log/syslog | grep cron
# 5. 手动测试命令
/path/to/command
# 6. 检查环境变量
crontab -l
10. 复杂示例
备份脚本示例
# 每天凌晨2点备份数据库
0 2 * * * /home/user/scripts/backup_db.sh >> /var/log/backup.log 2>&1
# 每周一凌晨3点清理临时文件
0 3 * * 1 /home/user/scripts/cleanup.sh >> /var/log/cleanup.log 2>&1
# 每月1号凌晨1点生成月度报告
0 1 1 * * /home/user/scripts/monthly_report.sh
监控脚本示例
# 每5分钟检查服务状态
*/5 * * * * /home/user/scripts/check_service.sh
# 每小时检查磁盘空间
0 * * * * /home/user/scripts/check_disk.sh
# 工作日工作时间每30分钟同步数据
*/30 9-17 * * 1-5 /home/user/scripts/sync_data.sh
总结
- crontab -e 是管理个人定时任务的主要方式
- 时间格式:
分 时 日 月 周 - 始终使用绝对路径
- 合理处理输出和错误
- 注意环境变量差异
- 定期检查日志进行监控
- 注意:定时任务中如果命令部分如果有%的,需要加“ \ ”,因为定时任务不认识%,又或者将该命令写入shell脚本中。
Comments 1 条评论
作者,请问为什么第四点的安全配置那里,我的/etc/下面没有cron.allow和cron.deny文件呀?