Linux Cron 定时任务
在 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 相关的定时任务(如通过脚本操作网页),请告诉我!