Crontab 定时任务
crontab
crontab命令常见于Unix和类Unix的操作系统之中,用于设置周期性被执行的指令。该命令从标准输入设备读取指令,并将其存放于crontab文件中,以供之后读取和执行。该词来源于希腊语chronos(χρνο),原意是时间。通常,crontab储存的指令被守护进程激活,crond常常在后台运行,每一分钟检查是否有预定的作业需要执行。这类作业一般称为cron jobs。
/etc 目录下的几个 cron 目录
/etc目录主要用来存放系统中的配置文件,基本上所有的配置文件都可以在这里找到。运行以下命令查看:
1 | ls /etc/cron* |
这个命令会列出/etc目录下所有以cron开头的文件和文件夹。可以看到主要有以下文件夹:
1 | /etc/cron.hourly # 这里存放了每小时需要运行的脚本 |
我们可以把我们需要定时运行的脚本放到对应的文件夹中,系统就会定时运行对应的脚本了。那么系统是怎么做到的呢?
除了上面几个文件夹外,在/etc目录下,还有一个crontab文件,该文件内容如下:
1 | # /etc/crontab: system-wide crontab |
crontab文件是一个系统级别的配置文件,里面配置了什么时候去运行什么文件的规则。Linux会定期去扫描对应的文件夹,运行里面的脚本。这就完成了定时执行任务的功能。
cron服务
cron是一个linux下的定时执行工具,可以在无需人工干预的情况下运行作业。由于cron 是Linux的内置服务,但它不自动起来,可以用以下的方法启动、关闭这个服务:
1 | service cron start # 启动服务 |
cron命令每分钟会定期检查是否有要执行的工作,如果有要执行的工作便会自动执行该工作。而Linux任务调度的工作主要分为以下两类:
- 系统执行的工作:系统周期性所要执行的工作,如备份系统数据、清理缓存;
- 个人执行的工作:某个用户定期要做的工作,例如每天备份数据库等。
在/var/spool/cron/目录下是所有用户的crontab文件,你也可以去看看。上面说到的/etc下的配置都是属于系统级别的,那么个人级别的定时执行如何来做呢?这就需要说到下面的crontab命令了。
crontab命令
cron服务提供crontab命令来设定cron服务的,以下是这个命令的一些参数与说明:
1 | crontab -u //设定某个用户的cron服务,一般root用户在执行这个命令的时候需要此参数 |
如果不指定用户,就是当前系统的登陆用户。
当你输入命令:crontab -e时,就会出现一个文件,让你填写对应的定时规则,这个规则是什么?
定时规则
看这条规则:
1 | 25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily ) |
这就是一条规则,表示每天的6点25分执行对应的脚本。没有看明白,不要紧,容我慢慢道来。
以下是 crontab 文件的格式:
1 | {minute} {hour} {day-of-month} {month} {day-of-week} {full-path-to-shell-script} |
- minute:区间为0–59;
- hour:区间为0–23;
- day-of-month:区间为0–31;
- month:区间为1–12;1是1月,12是12月;
- Day-of-week:区间为0–6;周日是0。
除了数字还有以下几个特殊的符号需要特殊说明:*:代表所有的取值范围内的数字;/:代表每的意思,”*/5″表示每5个单位;-:代表从某个数字到某个数字;,:分开几个离散的数字。
以下举几个例子说明问题:
1 | 每五分钟执行 */5 * * * * /home/jelly/test.sh |
我想这下你应该明白了,如果还没有明白,没问题,再来个实例,你就能明白了。
一个小Demo
先准备以下这么一段简短的脚本:
1 | #!/bin/bash |
保存为文件backupDemo.sh。
bash脚本不懂,没关系,看这里:
在终端输入以下命令:
1 | crontab -e |
在显示的文件末尾添加以下规则:
1 | */1 * * * * /home/jelly/MySource/Shell/backupDemo.sh >> /home/jelly/log.log |
编辑完成,保存完成以后,就会显示以下提示信息:
1 | crontab: installing new crontab |
这就说明正在安装新的定时任务,如果没有这条提示信息,请重新运行crontab -e命令。
接下来就会看到在/home/jelly目录下会生成一个log.log文件,并写入了输入的信息。
没有问题,搞定了。