写在前面
(这段是我自言自语,用来记录工作生活的废话,可以不用看)
最近实验室的项目中需要实现一个定时功能,需要将数据库中每一周的数据做一个统计,生成周报在网站上展示,并提供每周数据的下载,考虑到数据量比较大,若即时统计以及生成下载文件,会严重拖慢网页的访问速度和下载速度。因此,需要提前统计好周报数据以及提取每周数据并生成文件,由于数据每周都会更新,若每周人为地去操作这些将会是一件很繁琐的事情(毕竟我记忆力不好),想偷懒,所以就想着找一个Linux可用的定时器,能够周期性地地运行我写好的用来统计数据和生成文件的代码,于是就让我找到了Cron。
Cron简介
Cron-wikicrontab
命令常见于Unix和类Unix的操作系统之中,用于设置周期性被执行的命令。该命令从标准输入设备读取指令,并将其存放于“crontab”文件中,以供之后读取和执行。该词来源于希腊语chronos(χρόνος),原意是时间。
通常,crontab
储存的指令被守护进程激活,crond
常常在后台运行,每一分钟检查是否有预定的作业需要执行。这类作业一般称为cron jobs。
## Crontab文件
用户所建立的crontab文件中,每一行都代表一项任务,每行的每个字段代表一项设置,它的格式共分为六个字段,前五段是时间设定段,第六段是要执行的命令段
语法格式
minute hour day-of-month month day-of-week command
其中:
- minute: 分钟,范围是0-59
- hour: 小时,范围是0-23
- day-of-month: 日期,范围是1-31
- month: 月份,范围是1-12
- day-of-week: 星期几,范围0-7(星期天可以使0或7)
- command: 要执行的命令,或者需要执行的脚本文件的全路径
上述字段中,还可以使用一下特殊字符:
- 星号(*):代表所有可能的值,若某个字段值为’*‘,则表示在该字段的每一个可能值下都执行该命令;如month为’*’,则在满足其他字段的制约条件下每个月都执行该命令;
- 逗号(,):用逗号隔开的值指定一个列表的范围,如:”1,2,3”;
- 短杠(‘-‘): 用于整数之间,表示一个连续的整数范围,如:”1-3”,表示”1,2,3”;
- 斜杠(‘/‘):指定时间的间隔频率,如:hour字段为”10-22/2”表示10点到22点之间每两小时执行一次;
- 星号(*)和斜杠(‘/‘)可一起使用,如:minute字段为”*/10”表示每十分钟执行一次。
我需要每周执行一次,于是任务项应该是:
0 0 * * 1 my_command
即:每周的0点0分执行my_command命令
输出配置
若是想要查看运行的情况,可将运行的结果输出到文件中,在每一行的任务项后再加上文件路径和输出内容的类型,例如,我会将运行的结果或错误信息都输出到log文件中:
0 0 * * 1 my_command >/path/of/cron.log 2>&1 &
若不想让其有内容输出,可将文件路径写成/dev/null
注:’>’表示重定向,bash中0,1,2三个数字分别代表STDIN_FILENO、STDOUT_FILENO、STDERR_FILENO,即标准输入(一般是键盘),标准输出(一般是显示屏,准确的说是用户终端控制台),标准错误(出错信息输出;”2>&1”则表示将标准错误重定向到标准输出中的,输出到前面的文件里,最后的’&’表示让bash在后台运行。
crontab命令
命令格式
crontab [-u user] [-e | -l | -r]
参数详解
- -u user: 用来设定某个用户的crontab服务,此参数一般有root用户来运行,若不指定用户,则表示对当前用户的crontab文件进行操作;
- -e: 编辑某个用户的crontab文件内容;
- -|: 显示某个用户的crontab文件内容;
- -r: 从/var/spool/cron目录中删除的crontab文件;
crond服务
包括crond服务启动、停止和重启
系统中可使用service命令
$ service crond start
$ service crond stop
$ service crond restart
注:crond
也有可能是 cron
,如果前者不行,可以试下后者
无法使用service命令
/etc/init.d/cron stop
/etc/init.d/cron start