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
守护进程,可以实现系统管理和维护任务的自动化,极大提高工作效率和系统可靠性。