背景:基于Linux执行C++程序从网页上面抓取数据,而网页上面的数据每天会更新,为此需要每天去重新抓一次数据。那么有没有方法会每天定时执行,从而达到每天更新数据的方法呢?Linux中有个crontab命令可以解决。
crontab命令常见于Unix和Linux的操作系统之中,用于设置周期性被执行的指令。该命令从标准输入设备读取指令,并将其存放于"crontab"文件中,以供之后读取和执行。
在Linux系统中,Linux任务调度的工作主要分为以下两类:
1、系统执行的工作:系统周期性所要执行的工作,如备份系统数据、清理缓存
2、个人执行的工作:某个用户定期要做的工作,例如每隔10分钟检查邮件服务器是否有新信,这些工作可由每个用户自行设置
一、/etc/crontab、/etc/cron.deny 、 /etc/cron.allow文件介绍
系统调度的任务一般存放在/etc/crontab这个文件下,里面存放了一些系统运行的调度程序,通过命令我们可以看一下里面的内容:
[root@xiaoluo ~]# cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
# For details see man 4 crontabs
# Example of jobdefinition:
#.---------------- 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 or7) ORsun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
这些任务都会是系统在运行起来后自动进行调度的。同时在/etc目录下还存放了/etc/cron.deny 和 /etc/cron.allow 文件
/etc/cron.deny 表示不能使用crontab 命令的用户
/etc/cron.allow 表示能使用crontab的用户。
如果两个文件同时存在,那么/etc/cron.allow 优先。
如果两个文件都不存在,那么只有root用户可以安排作业。
二、.crontab命令语法及其各个参数含义
crontab命令的语法为:
crontab [-e[UserName]|-l [UserName]|-r [UserName]|-v [UserName]|File ]
注意:crontab 是用来让使用者在固定时间或固定间隔执行程序之用,换句话说,也就是类似使用者的时程表。-u user 是指设定指定 user 的时程表,这个前提是你必须要有其权限(比如说是 root)才能够指定他人的时程表。如果不使用 -u user 的话,就是表示设定自己的时程表。
各个参数说明:
-e [UserName]: 执行文字编辑器来设定时程表,内定的文字编辑器是 vi
-r [UserName]: 删除目前的时程表
-l [UserName]: 列出目前的时程表
-v [UserName]:列出用户cron作业的状态
三、crontab命令的格式
我们如果要创建自己的一个任务调度,可以使用 crontab -e 这个命令,如:
[root@xiaoluo ~]#crontab -e
此时会进入到vi编辑界面,来编写我们要调度的任务,crontab调度命令的格式如下:
* * * * * commandpath // 前五个字段可以取整数值,指定何时开始工作,第六个域是字符串,即命令字段,其中包括了crontab调度执行的命令。 各个字段之间用spaces和tabs分割。
调度命令的规则:
字段名称 |
说明 |
取值范围 |
分钟 |
每小时的第几分钟执行 |
0-59 |
小时 |
每日的第几个小时执行 |
0-23 |
日期 |
每月的第几天执行 |
1-31 |
月历 |
每年的第几月执行 |
1-12 |
星期 |
每周的第几天执行 |
0-6 |
命令名称 |
欲执行的命令及参数 |
|
crontab命令中的一些常用特殊符号:
符号 |
说明 |
* |
表示任何时刻 |
, |
表示分割 |
- |
表示一个段,如第二段里: 1-5,就表示1到5点 |
/n |
表示每个n的单位执行一次,如第二段里,*/1, 就表示每隔1个小时执行一次命令。也可以写成1-23/1. |
下面给出一些crontab命令的实例: