目录
crontab命令概要
crontab命令常见于Linux和类Unix操作系统之中,是一个定期执行指定命令的工具。crontab命令来自英文词组“cron table”的缩写,cron来自于希腊语“chronos”代表时间的意思,table代表了需要定时执行的任务列表。crontab的功能就是管理定时计划任务,配合不同的参数选项实现对定时任务的增、删、改、查,调度的时间间隔精确到分钟级别。
安装Linux或者类Unix操作系统时,部分Linux或者类Unix发行版都会默认安装该工具,其中:
- cron是服务名称;
- crond是后台运行的进程名称;
- rontab是周期性执行的计划任务列表;
Linux调度任务类型
Linux下任务定时调度主要分为两类,分别是系统任务调度和用户任务调度:
系统任务调度
系统任务调度:系统周期性所要执行的工作,比如写缓存数据到硬盘、日志清理等。在/etc目录下有一个crontab文件,这个就是系统任务调度的配置文件。/etc/crontab文件包括下面几行:
# Run the hourly jobs SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root 01 * * * * root run-parts /etc/cron.hourly 11 9 * * * root run-parts /etc/cron.daily 15 6 * * 0 root run-parts /etc/cron.weekly 35 5 1 * * root run-parts /etc/cron.monthly
前三行是用来配置crond任务运行的环境变量,第一行SHELL变量指定了系统要使用哪个shell,这里是bash,第二行PATH变量指定了系统执行命令的路径,第三行MAILTO变量指定了crond的任务执行信息将通过电子邮件发送给root用户,如果MAILTO变量的值为空,则表示不发送任务执行信息给用户。
用户任务调度
用户任务调度:用户定期要执行的工作,比如用户数据备份、定时邮件提醒等。用户可以使用crontab工具来定制自己的计划任务。所有用户定义的crontab文件都被保存在/var/spool/cron目录中,其文件名与用户名一致。此外crontab命令还支持用户权限控制,主要通过以下两个文件实现:
/etc/cron.deny #位于该文件中的用户名不能使用crontab /etc/cron.allow #位于该文件中的用户名可以使用crontab
如果这两个文件都不存在,那么只有超级用户才被允许使用某个特定的命令。Cron权限也可以使用PAM(Pluggable Authentication Module)认证来限制用户是否可以使用crontab来创建定时任务,PAM配置位于/etc/cron.d/目录下。
crontab命令语法
命令格式
crontab [-u user] file crontab [-u user] [ -e | -l | -r | -i ]
命令选项
- -u 用户名:用来设定某个用户的crontab服务,如果未指定默认为当前用户;
- file:将指定文件做为crontab的任务列表文件并载入crontab,如果在命令行中没有指定该文件,crontab命令将接受标准输入(键盘)上键入的命令,并将它们载入crontab;
- -e:编辑某个用户的定时任务列表,如未通过-u参数指定用户则默认为当前用户;
- -l:查看某个用户的定时任务列表,如未通过-u参数指定用户则默认为当前用户;
- -r:删除某个用户的定时任务列表,如未通过-u参数指定用户则默认为当前用户;
- -i:删除某个用户的定时任务列表给予提示;
文件格式
crontab文件中,每一行代表一个任务;每行有七列每列代表一项设置,前五列为时间频率设定,第六列是以哪个用户名来执行(该列可省略),第七列为要执行的任务。示例:
minute hour day month week user-name command # For details see man 4 crontabs # Example of job definition: .---------------------------------- minute (0-59) | .------------------------------- hour (0-23) | | .---------------------------- day of month (1-31) | | | .------------------------- month (1-12) OR jan,feb,mar,apr ... | | | | .---------------------- day of week (0-6) (Sunday=0 or 7) OR sun,mon,tue ... | | | | | .------------------- username | | | | | | .------ command | | | | | | | * * * * * user-name command to be executed
- minute:表示分钟,取值范围为0到59之间整数值
- hour:表示小时,取值范围为0到23之间整数值;
- day of month:表示日期,取值范围为1到31之间整数值;
- month:表示月份,取值范围为1到12之间整数值;同时支持jan, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec表示方法;
- day of week:表示星期,取值范围为0到7之间整数值。其中0或7表示星期天,同时支持sun, mon, tue, wed, thu, fri, sat表示方法;
- username:指定执行定时任务的用户名;
- command:要执行的命令,可以是系统命令也可以是脚本文件;
以上字段除了可以使用数字外,还可以使用一下特殊字符表示时间:
特殊字符 | 含义 |
---|---|
*(星号) | 表示所有可能的值,可以理解为“每” |
,(逗号) | 逗号隔开的值表示一个列表范围,如1,2,3 * * * *表示每天每小时的第一、第二、第三分钟执行一次定时任务 |
-(减号) | 减号隔开的值表示一个数值范围,如1-10 * * * *每天每小时的1到10分钟每分钟执行一次定时任务 |
/n(斜杠) | 指定执行任务的间隔频率,如 0 10-18/2 * * *每天的十点到十八点每2小时执行一次定时任务 |
使用示例
每1分钟执行一次command
* * * * * command
每小时的第5、第10和第15分钟执行一次command
5,10,15 * * * * command
每天晚上20点到22点的第5和第15分钟各执行一次command
5,15 20-22 * * * command
每隔两天的晚上20点到22点的第5和第15分钟各执行一次command
5,15 20-22 */2 * * command
每周一凌晨4点到5点的第5和第15分钟各执行一次command
5,15 4-5 * * 1 command
每天00:30执行系统备份脚本
30 0 * * * /home/micboy/scripts/backup.sh
每小时的第5、第10和第15分钟将系统所有进程保存到日志中
5,10,15 * * * * /usr/bin/ps aux >> /home/micboy/logs/ps.log
每一小时重启重启一次apache
* */1 * * * systemctl restart httpd
在一月的每个星期一上午12:01执行一次更新脚本
01 00 * Jan Monday /home/micboy/scripts/update.sh
指定更新脚本只在第一个星期天执行
通过crontab提供的时间参数不可能实现该功能,但可以使用命令字段中的条件控制语句来实现。
0 2 * * sun [ $(date +%d) -le 07 ] && /home/micboy/scripts/update.sh
每月1号和15号检查/home挂载的磁盘
0 0 1,15 * * /usr/sbin/fsck /home
每30秒执行一次指定软件更新脚本
crontab命令调度的定时任务时间粒度最小为分钟级,不过可以变相实现。
* * * * * sleep 30; /home/micboy/scripts/update.sh
一行crontab可以配置多个任务,用分号(;)来分隔任务。
* * * * * /home/micboy/scripts/update.sh; /home/micboy/scripts/backup.sh
补充内容
crontab提供了@ 后跟关键字的方式来代替上述五个字段–例如 reboot、yearly、weekly、hourly等。
关键字 | 等价的crontab表达式 | 含义 |
---|---|---|
@reboot | – | 重启时执行指定的调度任务 |
@yearly | 0 0 1 1 * | 每年执行一次指定的调度任务 |
@annually | 0 0 1 1 * | 每年执行一次指定的调度任务 |
@monthly | 0 0 1 * * | 每个月执行一次指定的调度任务 |
@weekly | 0 0 * * 0 | 每个星期执行一次指定的调度任务 |
@daily | 0 0 * * * | 每天执行一次指定的调度任务 |
@hourly | 0 * * * * | 每小时执行一次指定的调度任务 |
日常开发或者运维过程中,可以通过访问https://crontab.guru/对自己编写的crontab表达进行校验:
crontab注意事项
- crontab文件中获取不到系统环境变量的值,如果需要使用请编写脚本在脚本中获取。
- crontab创建定时任务时,设置的路径一定是绝对路径且目录必须存在才能出结果。
- 星期几和几号最好不要同时出现,因为它们定义的都是天,非常容易让人理解混乱。
- 新创建的定时不会马上执行,至少要过2分钟才执行,如果想马上执行请重启cron服务。
- 更新系统时间时区后需要重启cron服务,在ubuntu中服务名为cron:service cron restart。
- 当crontab失效时可以尝试/etc/init.d/crond restart解决问题。或者查看日志看某个job执行是否报错tail -f /var/log/cron。
- 千万不要随意执行crontab -r,该命令将会从Crontab目录(/var/spool/cron)中删除用户的所有Crontab文件,所有crontab创建的定时任务都将被删除。
- crontab中%有特殊含义,表示换行。如果要用的话必须进行转义%,如经常用的date ‘+%Y%m%d’在crontab中是不会执行的,应该换成date ‘+\%Y\%m\%d’。
转载请注明:麦童博客 » Linux crontab命令详解