crontab命令常见于Unix和Linux的操作系统之中,用于设置周期性被执行的指令。该命令从标准输入设备读取指令,并将其存放于“crontab”文件中,以供之后读取和执行。通常,crontab储存的指令被守护进程激活。crond 常常在后台运行,每一分钟检查是否有预定的作业需要执行。这类作业一般称为cron jobs。
一、安装
[root@CentOS ~]# yum -y install vixie-cron
[root@CentOS ~]# yum -y install crontabs
说明:
vixie-cron 软件包是 cron 的主程序;
crontabs 软件包是用来安装、卸装、或列举用来驱动 cron 守护进程的表格的程序。
二、配置
cron 是 linux 的内置服务,但它不自动起来,可以用以下的方法启动、关闭这个服务:
service crond start //启动服务
service crond stop //关闭服务
service crond restart //重启服务
service crond reload //重新载入配置
service crond status //查看crontab服务状态
在CentOS系统中加入开机自动启动: chkconfig –level 345 crond on
cron 的主配置文件是 /etc/crontab,它包括下面几行:
Shell在编程方面比Windows批处理强大很多,无论是在循环、运算。
bash支持一维数组(不支持多维数组),并且没有限定数组的大小。类似与C语言,数组元素的下标由0开始编号。获取数组中的元素要利用下标,下标可以是整数或算术表达式,其值应大于或等于0。
定义数组
在Shell中,用括号来表示数组,数组元素用“空格”符号分割开。定义数组的一般形式为:
array_name=(value1 … valuen)
例如:array_name=(value0 value1 value2 value3)
或者:array_name=(
value0
value1
value2
value3
)
还可以单独定义数组的各个分量:
格式化复制
array_name[0]=value0
array_name[1]=value1
array_name[2]=value2
可以不使用连续的下标,而且下标的范围没有限制。
读取数组
获得当天的日期
date +%Y-%m-%d
输出: 2011-07-28
将当前日期赋值给DATE变量
DATE=$(date +%Y%m%d)
有时候我们需要使用今天之前或者往后的日期,这时可以使用date的 -d参数
获取明天的日期
date -d next-day +%Y%m%d
获取昨天的日期
date -d last-day +%Y%m%d
获取上个月的年和月
date -d last-month +%Y%m
获取下个月的年和月
date -d next-month +%Y%m
获取明年的年份
date -d next-year +%Y
下面是一些date参数的说明和一些例子
需求:最近用php做了一个功能需要用shell定时跑,但是这个数据很大,php一次执行不完,所以需要分页。那么问题来了,由于并不知道要分多少页面。shell脚本的crontab并不太好设定
那么我就用shell写了个程序,来调用这个分页的php接口,然后用crontab执行这个shell。好了废话少说,直接上代码
#!/bin/bash bindir="./bin" dels=${bindir}"/*.sh" rm -rf $dels if [ $1 -gt 0 -a $2 -gt 0 ];then urls="http://localhost/views/count/type/$1/count/$2" result=$(curl -s $urls) #要将$a分割开,可以这样: OLD_IFS="$IFS" IFS="," arr=($result) IFS="$OLD_IFS" i=0 for s in ${arr[@]} do #创建文件到bin下面然后批量执行 ((i++)) str="#!/bin/bash " strs=" curl -s \"$s\"" echo $str >> ${bindir}"/$i.sh" echo $strs >> ${bindir}"/$i.sh" #curl -s "$s" done chmod 777 -R $bindir #读取文件夹下所有的文件并执行 for fileAll in ${bindir}/*;do tempFile=`basename $fileAll` echo ${bindir}"/"${tempFile} sh ${bindir}"/"${tempFile} done fi
把上面的代码保存成 do.sh
# sh do.sh 1 250
success : 36 S
简单说明一下 首先我们要给do.sh设置可执行权限 在当前文件下建立一个bin文件夹,并可写。
这个do.sh会在bin目录下生成很多sh文件并分批执行
两种方式实现执行来自php接口数据
需求:有时候我们需要在后台批量的处理一些任务,而PHP&nginx有很短时间内超时。所有一个任务可能要分N次处理。
由于crontab比较弱,我们不可以把一个任务拆分N次,写入其中。这里我写了sh 和 python实现php分批处理,当然我们可以放到crontab中运行
0 */8 * * * /usr/bin/python /home/view.py 1 250
0 */8 * * * /usr/bin/sh /home/view.sh 2 50
说明一下参数 其中 参数1 是类型 参数2是每页多少数据
http://localhost/views/count/type/$1/count/$2 这个接口返回是分页后的url 也就是我们真正要执行的php接口路径
python请求此接口返回的是json 由于sh操作json比较麻烦 我就用英文逗号分隔返回的是字符串
此方法提供的是一种思路,供大家参考
一下是代码包 转载请注明来源批量执行来自php接口的数据