使用Crontab安排Cron作业
Cron是一个调度守护程序,它以指定的时间间隔执行任务。
这些任务称为cron作业,主要用于自动进行系统维护或者管理。
例如,我们可以将cron作业设置为自动执行重复性任务,例如备份数据库或者数据,使用最新的安全补丁更新系统,检查磁盘空间使用情况,发送电子邮件等等。
可以将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。
{每小时,每天,每天,每周,每月}目录中,并且这些脚本将每隔'每小时/每天/每周/每月”执行一次。
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作业。
* * * * * <username> command(s)
预定义的宏
有几个特殊的Cron时间表宏用于指定公共间隔。
我们可以使用这些快捷方式代替五列日期规范。
- '@yearly'(或者'@annually')-每年1月1日午夜(12:00 am)运行一次指定的任务。相当于'0 0 1 1 *'。
- '@monthly'-在每月的第一天的每月午夜运行一次指定的任务。相当于'0 0 1 * *'。
- '@weekly'-每周一次在星期日的午夜运行指定的任务。相当于'0 0 * * 0'。
- '@daily'-每天午夜运行一次指定的任务。相当于'0 0 * * *'。
- '@hourly'-在小时开始时每小时运行一次指定的任务。等效于'0 * * * *'。
- '@reboot'-在系统启动时(引导时)运行指定的任务。
Linux Crontab命令
'crontab'命令允许我们安装,查看或者打开crontab文件进行编辑:
- 'crontab -e'-编辑crontab文件,或者创建一个(如果尚不存在的话)。
- 'crontab -l'-显示crontab文件的内容。
- 'crontab -r'-删除当前的crontab文件。
- 'crontab -i'-在删除之前,通过提示删除当前的crontab文件。
- 'crontab -u <用户名>'-编辑其他用户crontab文件。此选项需要系统管理员特权。
crontab命令使用“ VISUAL”或者“ EDITOR”环境变量指定的编辑器打开crontab文件。
Crontab变量
cron守护程序会自动设置几个环境变量。
- 默认路径设置为'PATH =/usr/bin:/bin'。如果我们要执行的命令不在cron指定的路径中,则可以使用命令的绝对路径,也可以更改cron的$PATH变量。我们不能像使用常规脚本那样隐式添加':$PATH'。
- 默认的shell设置为'/bin/sh'。要更改其他shell,请使用“ SHELL”变量。
- Cron从用户的主目录调用该命令。可以在crontab中设置“ HOME”变量。
- 电子邮件通知将发送给crontab的所有者。要覆盖默认行为,可以将“ MAILTO”环境变量与要接收电子邮件通知的所有电子邮件地址一起使用列表(以逗号分隔)。当定义了'MAILTO'但为空('MAILTO =“”')时,不发送邮件。
Crontab限制
“ /etc/cron.deny”和“ /etc/cron.allow”文件使我们可以控制哪些用户可以访问“ crontab”命令。
这些文件由用户名列表组成,每行一个用户名。
默认情况下,只有“ /etc/cron.deny”文件存在并且为空,这意味着所有用户都可以使用crontab命令。
如果要拒绝特定用户对crontab命令的访问,请将用户名添加到该文件中。
如果“ /etc/cron.allow”文件存在,则仅此文件中列出的用户可以使用“ crontab”命令。
如果两个文件都不存在,则只有具有管理特权的用户才能使用“ crontab”命令。
Cron Jobs示例
以下是一些cron作业示例,这些示例显示了如何计划任务在不同时间段运行。
- 从星期一到星期五,每天的15:00运行命令:
0 15 * * 1-5 command
- 每5分钟运行一个脚本,并将标准输出重定向到'dev null',仅将标准错误发送到指定的电子邮件地址:
[email protected] */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 pm运行脚本:
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 [email protected] */1 * * * * command