一、crontab
crontab命令被用来提交和管理用户的需要周期性执行的任务,crond进程每分钟会定期检查是否有要执行的任务。
添加、显示文件:
crontab(选项)(参数)
-e:编辑该用户的计时器设置(如果不存在将会自动新建);
-l:列出该用户的计时器设置;
-r:删除该用户的计时器设置;
-u<用户名称>:指定要设定计时器的用户名称。
文件内参数说明:
minute hour day month week command 顺序:分 时 日 月 周
minute: 表示分钟,可以是从0到59之间的任何整数。
hour:表示小时,可以是从0到23之间的任何整数。
day:表示日期,可以是从1到31之间的任何整数。
month:表示月份,可以是从1到12之间的任何整数。
week:表示星期几,可以是从0到7之间的任何整数,这里的0或7代表星期日。
command:要执行的命令,可以是系统命令,也可以是自己编写的脚本文件。
在以上各个字段中,还可以使用以下特殊字符:
星号(*):
代表所有可能的值,例如month字段如果是星号,则表示在满足其它字段的制约条件后每月都执行该命令操作。
逗号(,):
可以用逗号隔开的值指定一个列表范围,例如,“1,2,5,7,8,9”
中杠(-):
可以用整数之间的中杠表示一个整数范围,例如“2-6”表示“2,3,4,5,6”
正斜线(/):
可以用正斜线指定时间的间隔频率,例如“0-23/2”表示每两小时执行一次。同时正斜线可以和星号一起使用,例如*/10,如果用在minute字段,表示每十分钟执行一次。
如:
每隔两天的上午8点到11点的第3和第15分钟执行
3,15 8-11 */2 * * command
自动以时间命名导出数据库命令:
05 12 1 1,4,7,10 * mysqldump -uname -p1234234 a>asql`date +"\%Y\%m\%d_\%H:\%M"`.sql
查询服务是否开启:
查看服务状态: service crond status
启动服务: service crond start
查看服务是否已设置为开机启动: ntsysv
加入开机自动启动: chkconfig –level 35 crond on
二、定时调用Thinkphp链接
1、首先在Controller中写入控制器,写法与平常相同。
public function reset(){
//为了安全,一般判定来源IP,使用秘钥进行权限验证
}
需要注意的是链接问题:
我在浏览器中使用下面链接可以正常访问:
http://www.ccc.com/aaa/index.php/home/bbb/reset
但是在linux使用wget访问时出现404 Not Found。发现其实应该使用下列链接:
http://www.ccc.com/index.php/home/bbb/reset
2、新建crontab文件,并写入命令:
crontab -e //新建文件
写入如下:
//每分钟调用一次
* * * * * wget -q "http://www.ccc.com/index.php/home/bbb/reset"
注意点
1、以下形式的date在crontab中不起作用
`date +"%Y%m%d_%H:%M"`
$(date +"%Y%m%d_%H:%M")
需改成:
`date +"\%Y\%m\%d_\%H:\%M"`
$(date +"\%Y\%m\%d_\%H:\%M")
你可以使用如下命令,查看crontab日志,会发现如果采用普通形式,命令执行不完整,直到date中+号这个地方:
tail /var/log/cron
2、在crontab里以sudo执行命令无效,提示 sudo: sorry, you must have a tty to run sudo 。
需要修改/etc/sudoers,执行visudo或者vim /etc/sudoers 将”Defaults requiretty”这一行注释掉。因为sudo默认需要tty终端,而crontab里的命令实际是以无tty形式执行的。注释掉”Defaults requiretty”即允许以无终端方式执行sudo