cron 是一个 Unix 类操作系统中的时间调度守护进程,用于在特定的时间或间隔运行指定的命令或脚本。它非常适合自动化系统管理和维护任务,如备份、日志轮转、系统监控等。以下是 cron 守护进程的详细介绍。
cron 守护进程的工作原理
-
crontab文件:cron从称为crontab(cron table)的文件中读取任务计划。每个用户都有自己的crontab文件,系统级任务在/etc/crontab和/etc/cron.d/目录中定义。crontab文件中每行定义一个计划任务,包括时间表达式和要执行的命令。
-
定期检查:
cron守护进程每分钟检查一次crontab文件和目录/var/spool/cron/crontabs/、/etc/cron.d/、/etc/crontab,以确定是否有任务需要执行。
-
执行任务:
- 当当前时间与
crontab文件中的时间表达式匹配时,cron执行相应的命令或脚本。
- 当当前时间与
crontab 文件格式
crontab 文件中的每一行代表一个任务,格式如下:
* * * * * command_to_be_executed
- - - - -
| | | | |
| | | | +----- 一周中的星期几 (0 - 7) (星期天为 0 或 7)
| | | +------- 月份 (1 - 12)
| | +--------- 日期 (1 - 31)
| +----------- 小时 (0 - 23)
+------------- 分钟 (0 - 59)
例如,每天凌晨 2 点运行备份脚本:
0 2 * * * /path/to/backup.sh
常用的 crontab 命令
查看 crontab 文件
crontab -l
编辑 crontab 文件
crontab -e
删除 crontab 文件
crontab -r
从文件安装 crontab
crontab filename
系统级 crontab 文件
除了用户级 crontab 文件外,还有一些系统级 crontab 文件:
-
/etc/crontab:系统级的crontab文件,格式与用户级略有不同。它包含了一个用户字段,指定哪个用户运行任务。SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root# m h dom mon dow user command 0 2 * * * root /path/to/backup.sh -
/etc/cron.d/目录:可以包含多个任务文件,文件中的每行格式与/etc/crontab相同。
cron 特殊字符串
cron 还支持一些特殊的字符串,用于简化时间表达式:
@reboot:在系统重启后运行。@yearly或@annually:每年运行一次,相当于0 0 1 1 *。@monthly:每月运行一次,相当于0 0 1 * *。@weekly:每周运行一次,相当于0 0 * * 0。@daily或@midnight:每天运行一次,相当于0 0 * * *。@hourly:每小时运行一次,相当于0 * * * *。
例如,每次系统重启后运行脚本:
@reboot /path/to/startup.sh
安全性和最佳实践
-
限制访问:
- 仅允许受信任的用户编辑和安装
crontab文件。 - 使用
/etc/cron.allow和/etc/cron.deny文件控制哪些用户可以使用crontab命令。
- 仅允许受信任的用户编辑和安装
-
日志记录:
- 配置
cron日志记录,以监控任务执行情况和故障。 - 在
/etc/rsyslog.conf或/etc/rsyslog.d/配置文件中确保cron日志记录是启用的,例如:cron.* /var/log/cron.log
- 配置
-
使用绝对路径:
- 在
crontab中指定命令和脚本的绝对路径,确保任务在预期的位置运行。
- 在
-
环境变量:
- 在
crontab文件中设置必要的环境变量,如PATH,确保任务能够找到需要的命令和脚本。
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin - 在
例子
用户级 crontab 示例
# 每天凌晨 1 点运行备份脚本
0 1 * * * /usr/local/bin/backup.sh# 每小时检查一次磁盘使用情况
0 * * * * /usr/local/bin/check_disk.sh# 每月 1 号凌晨 2 点清理日志文件
0 2 1 * * /usr/local/bin/clean_logs.sh
系统级 crontab 示例
# /etc/crontabSHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root# m h dom mon dow user command
0 3 * * * root /usr/local/bin/system_backup.sh
15 4 * * 7 root /usr/local/bin/weekly_report.sh
通过了解和正确配置 cron 守护进程,可以实现系统管理和维护任务的自动化,极大提高工作效率和系统可靠性。