用Crontab来调度Cron工作
Cron是一个调度守护程序,在指定的时间间隔内执行任务。这些任务被称为cron作业,主要用于自动化系统维护或管理。
例如,您可以设置一个cron job来自动执行重复性任务,如备份数据库或数据、用最新的安全补丁更新系统、检查磁盘空间使用情况、发送电子邮件,等等。
cron作业可以按分钟、小时、每月的某天、每月、每周的某天或这些的任意组合运行。
什么是Crontab文件?
Crontab(cron表)是一个指定cron作业时间表的文本文件。有两种类型的crontab文件。全系统的crontab文件和单个用户的crontab文件。
用户的crontab文件是根据用户的名字命名的,其位置因操作系统而异。在基于Red Hat的发行版中,如CentOS,crontab文件被存储在/var/spool/cron
目录下,而在Debian和Ubuntu中,文件被存储在/var/spool/cron/crontabs
目录下。
尽管你可以手动编辑用户的crontab文件,但建议使用crontab
命令。
/etc/crontab
文件和/etc/cron.d
目录内的脚本是全系统的crontab文件,只能由系统管理员编辑。
在大多数Linux发行版中,你也可以把脚本放在/etc/cron.{hourly,daily,weekly,monthly}
目录内,脚本将每隔hour/day/week/month
就执行一次。
Crontab的语法和操作符
用户crontab文件中的每一行都包含六个字,用空格隔开,后面是要运行的命令。
* * * * * command(s)
- - - - -
| | | | |
| | | | ----- Day of week (0 - 7) (Sunday=0 or 7)
| | | ------- Month (1 - 12)
| | --------- Day of month (1 - 31)
| ----------- Hour (0 - 23)
------------- Minute (0 - 59)
前五个字段可以包含一个或多个数值,用逗号隔开,或用连字符隔开的数值范围。
*
- 星号运算符意味着任何值或总是。如果你在 "小时 "字段中出现星号,意味着该任务将在每小时执行。,
- 逗号运算符允许你指定一个重复的值的列表。例如,如果你在小时字段中有1,3,5
,该任务将在凌晨1点、3点和5点运行。-
- 连字符运算符允许你指定一个值的范围。如果你在工作日字段里有1-5
,任务将在每个工作日运行(从周一到周五)。/
- 斜线运算符允许你指定将在它们之间的一定间隔内重复的值。例如,如果你在 "小时 "字段中有*/4
,这意味着该动作将每四小时执行一次。这与指定0,4,8,12,16,20
是一样的。你也可以用一个数值范围来代替斜线运算符前的星号,1-30/10
表示与1,11,21
相同。
全系统范围内的Crontab文件
全系统crontab文件的语法与用户crontabs略有不同。它包含一个额外的强制性用户字段,指定哪个用户将运行cron job。
* * * * * <username> command(s)
预定义的宏
有几个特殊的Cron时间表宏用于指定常见的时间间隔。你可以使用这些快捷方式来代替五栏式的日期规范。
@yearly
(或@annually
) - 每年在1月1日的午夜(12:00)运行一次指定的任务。相当于0 0 1 1 *
。@monthly
- 每月在该月的第一天的午夜运行一次指定的任务。相当于0 0 1 * *
。@weekly
- 每周在周日的午夜运行一次指定的任务。相当于0 0 * * 0
。@daily
- 每天在午夜运行一次指定的任务。相当于0 0 * * *
。@hourly
- 每小时开始时运行一次指定的任务。相当于0 * * * *
。@reboot
- 在系统启动时(boot-time)运行指定的任务。
Linux的Crontab命令
crontab
命令允许你安装、查看,或打开crontab文件进行编辑。
crontab -e
- 编辑crontab文件,如果它不存在,则创建一个文件。crontab -l
- 显示crontab文件的内容。crontab -r
- 移除你当前的crontab文件。crontab -i
- 移除你当前的crontab文件,在移除前有提示。crontab -u <username>
- 编辑其他用户的crontab文件。这个选项需要系统管理员的权限。
crontab命令使用由VISUAL
或EDITOR
环境变量指定的编辑器打开crontab文件。
Crontab 变量
cron 守护程序会自动设置几个环境变量 。
- 默认的路径被设置为
PATH=/usr/bin:/bin
。如果你要执行的命令不在cron指定的路径中,你可以使用命令的绝对路径或者改变cron的$PATH
变量。你不能像对普通脚本那样隐含地append:$PATH
。 - 默认的shell被设置为
/bin/sh
。要改变不同的shell,请使用SHELL
变量。 - Cron从用户的主目录调用该命令。
HOME
这个变量可以在crontab中设置。 - 电子邮件通知将被发送给crontab的所有者。要覆盖默认行为,你可以使用
MAILTO
环境变量,其中包含一个你想接收电子邮件通知的所有电子邮件地址的列表(逗号分隔)。当MAILTO
被定义但为空时(MAILTO=""
),不发送邮件。
Crontab的限制
/etc/cron.deny
和/etc/cron.allow
文件允许你控制哪些用户有权限使用crontab
命令。这些文件由一个用户名列表组成,每行一个用户名。
默认情况下,只有/etc/cron.deny
文件存在,并且是空的,这意味着所有用户都可以使用crontab命令。如果你想拒绝某个特定用户访问crontab命令,请将该用户名添加到该文件中。
如果/etc/cron.allow
文件存在,只有列在该文件中的用户可以使用crontab
命令。
如果这两个文件都不存在,那么只有具有管理权限的用户才能使用crontab
命令。
Cron工作的例子
下面是一些cron job的例子,显示了如何安排一个任务在不同的时间段运行。
从周一到周五,每天15:00运行一个命令。
0 15 * * 1-5 command
运行一个脚本每5分钟,并将标准输出重定向到
dev null
,只有标准错误会被发送到指定的电子邮件地址中。MAILTO=email@example.com */5 * * * * /path/to/script.sh > /dev/null
每周一下午3点运行两条命令(在命令之间使用运算符
&&
)。0 15 * * Mon command1 && command2
每2分钟运行一个PHP脚本,并将输出写入一个文件 。
*/2 * * * * /usr/bin/php /path/to/script.php >> /var/log/script.log
从早上8点到下午4点,每天每小时都要运行一个脚本,每小时都要运行一次。
00 08-16 * * * /path/to/script.sh
在每个月的第一个星期一上午7点运行一个脚本。
0 7 1-7 * 1 /path/to/script.sh
在每个月的1号和15号晚上9点15分运行一个脚本。
15 9 1,15 * * /path/to/script.sh
设置自定义的
HOME
、PATH
、SHELL
和MAILTO
变量,并每分钟运行一条命令。HOME=/opt PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin SHELL=/usr/bin/zsh MAILTO=email@example.com */1 * * * * command
总结
Cron是一个守护程序,它允许你在特定的日期和时间安排任务。
如果您有任何问题,请随时留言咨询。