🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# Crond介绍 [TOC]   Crond是Linux系统中用来定期执行命令或制定程序任务的服务,通过`crontab`我们可以在固定的间隔时间执行指定的系统指令或shell script脚本,适合周期性的日志分析或者数据备份,时间间隔的耽误可以是分、时、日、月、周以及以上任意组合。 Linux任务调度的工作分为以下两类:   1. 系统自身执行的工作:系统周期性执行的任务工作,如轮询系统日志,备份系统数据,清理缓存。   2. 用户执行的工作过:某个用户定期要做的任务工作,例如每隔十分钟同步互联网的时间。 ## 语法 crontab [-u sysUser] file.sh crontab [-u user] [-l|-r|-e] ### 使用者权限文件 |文件|说明| |-|-| |`/etc/cron.deny`|该文件中所列用户不允许使用crontab命令| |`/etc/cron.allow`|该文件中列出用户允许使用crontab命令| |**`/var/spool/cron/`**|所有用户crontab文件存放的目录,以用户名命名| ### 语法含义 |参数名称|含义|指定示例| |-|-|-| |**`-l`**|显示用户`crontab`文件内容。|`crontab -l`| |**`-e`**|进入vi编辑用户crontab文件|`crontab -e`| |`-i`|删除用户crontab文件前确定提示|`crontab -i`| |`-r`|从crontab目录中删除用户crontab文件|`crontab -r`| |-u sysUser|指定使用者|`crontab -u root -l`| ### 指定时间格式   默认情况下,用户所建立的crontab文件存放于`/var/spool/cron`中,其crontab对应的文件名与用户名一致。   格式分为七段,前五段为时间设定段,第六段为以那个用户执行crontab(默认当前操作用户),第七段为索要执行的命令段。 格式如下: ~~~ 01 * * * * root run-parts /etc/cron.hourly 02 4 * * * root run-parts /etc/cron.daily 22 4 * * * root run-parts /etc/cron.weekly 42 4 1 * * root run-parts /etc/cron.momthly ~~~ #### crontab时间段的含义 |段|含义|取值范围| |-|-|-| |第一段|代表分钟|00~59| |第二段|代表小时|00~23| |第三段|代表日期|01~31| |第四段|代表月份|01~12| |第五段|代表星期几,0表示星期日|0~6(方便记忆忽略7)| #### 特殊符号含义 |特殊符号|含义| |-|-| |*|表示任意时间都执行,如`00 23 * * * commond`表示无论何月何日和周的23:00都执行任务| |-|减号表示分隔符,表示一个时间段,如`00 17-19 * * * commond`表示17~19点每小时的00分执行任务| |,|表示分割时段,如`30 17,18,19 * * * commond`表示每天的17点、18点和19点的半点时刻执行任务| |/n|n代表数字,即“每隔n单位hi件”如`*/10 * * * * commond`表示每10分钟执行一次任务(其中*/10也可以写成0-59/10)| ### crontab依赖的服务 ~~~ [root@localhost.localdomain ~] # chkconfig --list|grep crond crond 0:关闭 1:关闭 2:启用 3:启用 4:启用 5:启用 6:关闭 [root@localhost.localdomain ~] # /etc/init.d/crond status crond (pid 7087) 正在运行... [root@localhost.localdomain ~] # /etc/init.d/crond restart 停止 crond: [确定] 正在启动 crond: [确定] ~~~ ## 实例 1. **`30 3,12 * * * /bin/bash /scripts/backup.sh`** 每天凌晨3点个中午12点半的时刻(或者每天凌晨3:30和中午12:30)执行任务 2. **`30 */6 * * * /bin/bash /scripts/backup.sh`** 每隔6个半小时执行任务 3. **`30 8-18/2 * * * /bin/bash /scripts/backup.sh`** 早晨8点到下午18点之间每个2个半小时执行任务 4. **`30 21 * * * /bin/bash /scripts/backup.sh`** 每晚21:30执行任务 5. **`45 4 1,10,22 * * /bin/bash /scripts/backup.sh`** 每月1,10,22日的凌晨4:45执行任务 6. **`10 1 * * 60 /bin/bash /scripts/backup.sh`** 每周六、日的凌晨1:10分执行任务 7. **`0,30 18-23 * * * /bin/bash /scripts/backup.sh`** 每天18:00至23:30之间每隔30分钟执行任务 8. **`00 */1 * * * /bin/bash /scripts/backup.sh`** 每隔一小时整点执行任务 9. **`* 23-7/1 * * * /bin/bash /scripts/backup.sh`** *晚上23点到早上7点之间,每小时的每分钟都执行任务* 10. **`0 11 * 4 1-3 /bin/bash /scripts/backup.sh`** 4月的每周一到周三的11点执行任务 ## crontab命令的专业写法 **例:**每分钟打印自己的名字到/server/log/自己的名字命名的文件中 ~~~ # print char test by curder for programer A at 2015-10-20 */1 * * * * echo 'curder'>>/server/log/curder.log 2>&1 ~~~ **说明:** 1. 写定时任务要写清楚注释,如:谁,什么时间,因为谁,做了什么事 2. 执行任务时可以省略用户,在执行脚本时,尽量加上 `/bin/bash`(可能因为脚本没有执行权限而无法执行) 3. 需要root权限执行的任务可以登录到root用户下然后设置,如果不需要root权限,可以登录到普通用户下,然后设置,最后在脚本中将环境变量重新export一下 4. 定时任务命令的结尾最好加上`>/dev/null 2>&1`等内容。`2>&1`使标准错误和标准输出一样,本命令即把脚本的输出重定向到/dev/null,即不记录任何输出,也不给系统发邮件 5. 在开发定时任务程序或者脚本时,在调试脚本成功后,应尽量把debug及屏幕输出的内容的命令去掉,如果需要可以定向到日志里。