在 Linux 系统中,Cron 是一个用于调度定时任务的工具,允许用户在指定的时间或间隔自动执行脚本、命令或程序。它通过 crontab(Cron 表)配置文件来定义任务的执行时间和内容,非常适合自动化任务,如备份、日志清理或定时脚本运行。
一、Cron 基本概念
- Cron 守护进程(crond):Linux 系统后台运行的进程,负责检查 crontab 文件并执行定时任务。
- Crontab:每个用户的定时任务配置文件,存储任务的调度时间和命令。
- 任务类型:
- 用户级:每个用户可以有自己的 crontab 文件。
- 系统级:位于
/etc/crontab或/etc/cron.*目录,用于系统范围的任务。
二、Crontab 语法
Crontab 文件的每一行定义一个定时任务,格式如下:
* * * * * /path/to/your/script.sh
- 五个星号表示时间字段,依次为:
- 分钟(0-59)
- 小时(0-23)
- 日期(1-31)
- 月份(1-12 或 jan-dec)
- 星期(0-7,0 和 7 都表示周日)
- 命令:要执行的脚本或命令(需包含完整路径)。
- 特殊字符:
*:表示任意值(每分钟、每小时等)。,:列出多个值,例如1,3,5表示第 1、3、5 分钟。-:范围,例如1-5表示 1 到 5。/:步长,例如*/5表示每 5 单位(分钟、小时等)。
三、常用示例
- 每分钟执行一次:
* * * * * /bin/echo "Hello" >> /tmp/log.txt
每分钟将 “Hello” 追加到 /tmp/log.txt。
- 每天凌晨 2:30 执行备份:
30 2 * * * /bin/sh /backup.sh
- 每周一 8:00 执行任务:
0 8 * * 1 /usr/bin/python3 /script.py
- 每 5 分钟执行一次:
*/5 * * * * /bin/bash /check_status.sh
- 每月 1 号和 15 号执行:
0 0 1,15 * * /bin/sh /monthly_task.sh
四、Crontab 操作
- 编辑当前用户的 crontab:
crontab -e
打开默认编辑器(通常是 vi 或 nano)来编辑 crontab 文件。
- 查看当前用户的 crontab:
crontab -l
- 删除当前用户的 crontab:
crontab -r
- 指定用户编辑 crontab(需要 root 权限):
crontab -u username -e
- 系统级 crontab:
编辑/etc/crontab或在/etc/cron.d/目录下创建文件,格式多一个用户字段:
* * * * * username /path/to/script.sh
五、常见目录
/etc/crontab:系统级 crontab 文件。/etc/cron.hourly/、/etc/cron.daily/、/etc/cron.weekly/、/etc/cron.monthly/:放置周期性脚本的目录,适合简单任务。- 示例:将脚本放入
/etc/cron.daily/,确保脚本可执行(chmod +x script.sh)。
六、注意事项
- 环境变量:
- Cron 运行时的环境变量有限,可能缺少用户环境中的变量(如 PATH)。
- 解决方案:
- 在脚本中显式设置环境变量,例如
PATH=/usr/bin:/bin。 - 使用完整路径运行命令,如
/usr/bin/python3而不是python3。
- 在脚本中显式设置环境变量,例如
- 输出重定向:
- 默认情况下,Cron 任务的输出会通过邮件发送给用户(需要邮件服务如
postfix)。 - 重定向输出到文件: “`
- * * * * /script.sh >> /var/log/script.log 2>&1
`` (2>&1` 将标准错误重定向到标准输出)。
- * * * * /script.sh >> /var/log/script.log 2>&1
- 权限:
- 确保脚本或命令对运行用户有执行权限。
- 检查
/etc/cron.allow和/etc/cron.deny文件,控制哪些用户可以运行 Cron 任务。
- 日志查看:
- Cron 日志通常在
/var/log/cron或/var/log/syslog中(视系统而定)。 - 示例:
bash grep CRON /var/log/syslog
- 调试:
- 任务不运行?检查语法、权限、路径、日志。
- 手动运行脚本确认其正确性。
七、示例:定时清理日志
创建一个脚本 /clean_logs.sh:
#!/bin/bash
find /var/log -name "*.log" -mtime +7 -delete
设置权限并添加到 crontab:
chmod +x /clean_logs.sh
crontab -e
添加:
0 3 * * * /clean_logs.sh
此任务每天凌晨 3:00 删除 7 天前的 .log 文件。
八、其他工具
- anacron:适合非 24/7 运行的系统,处理错过的任务。
- systemd timers:现代 Linux 系统的替代方案,功能更强大但配置稍复杂。
九、总结
Cron 是 Linux 中强大且灵活的定时任务工具,通过简单的 crontab 语法即可实现自动化任务。确保脚本路径正确、权限适当,并定期检查日志以避免问题。
如果需要更具体的配置示例、调试帮助或与 DOM 相关的定时任务(如通过脚本操作网页),请告诉我!