天天看点

定时任务

在linux下执行定期任务可以使用crontab,目前mac os也可以使用它,不过已不推荐使用。推荐做法是采用plist脚本,plist脚本可以设置执行的动作,时间间隔等其他一些信息。另外crontab的最小时间间隔是一分钟,使用plist脚本原则上时间间隔可以为一秒。

php版的定时任务

定时任务

<?php  

$a = time();  

ignore_user_abort(); //关掉浏览器,php脚本也可以继续执行.  

set_time_limit(3000); // 通过set_time_limit(0)可以让程序无限制的执行下去  

$interval = 5; // 每隔5s运行   

while(1) {  

    sleep($interval);  

    //查询订单接口  

    echo $i . "---" . (time() - $a) . "<br/>";  

}  

?>  

mac

plist脚本存放路径为/library/launchdaemons或/library/launchagents,其区别是后一个路径的脚本当用户登陆系统后才会被执行,前一个只要系统启动了,哪怕用户不登陆系统也会被执行。

可以通过两种方式来设置脚本的执行时间。一个是使用startinterval,它指定脚本每间隔多长时间(单位:秒)执行一次;另外一个使用 startcalendarinterval,它可以指定脚本在多少分钟、小时、天、星期几、月时间上执行,类似如crontab的中的设置。

一个简单例子如下:

定时任务

<?xml version="1.0" encoding="utf-8"?>  

<!doctype plist public "-//apple//dtd plist 1.0//en" "http://www.apple.com/dtds/propertylist-1.0.dtd">  

<plist version="1.0">  

<dict>  

    <key>label</key>  

    <string>com.yangyz.cron.test.plist</string>  

    <key>programarguments</key>  

    <array>  

        <string>/users/yangyz/plist-test.sh</string>  

    </array>  

    <key>keepalive</key>  

    <false/>  

    <key>runatload</key>  

    <true/>  

    <key>startinterval</key>  

    <integer>60</integer>  

</dict>  

</plist>  

其中key是plist脚本定义的属性,紧跟着的下一行是该属性对应的值。上述脚本是每间隔60秒执行一次/users/yangyz/plist- test.sh这个shell脚本,也可以使用startcalendarinterval来替换startinterval达到同样的效果,例如:

定时任务

<key>startcalendarinterval</key>  

  <key>minute</key>  

  <integer>0</integer>  

上述设置的意思为每天的每个小时的第0分钟执行,也即使每60秒执行一次。plist脚本中定义的属性以及具体的含义,可以参看苹果官方网站的说明

launchctl命令可以控制plist脚本停止或重新加载。例如:

定时任务

#停止脚本com.yangyz.cron.test.plist运行  

launchctl unload /library/launchdaemons/com.yangyz.cron.test.plist   

#启动脚本com.yangyz.cron.test.plist运行  

launchctl load /library/launchdaemons/com.yangyz.cron.test.plist  

 如果执行上面命令看到launchctl: dubious ownership on file (skipping): /library/launchdaemons/com.yangyz.cron.test.plist这样的错误,其原因是该脚本的owner和当前执 行操作用户不一致。使用chown修改一下即可

linux crontab定时执行任务 命令格式与详细例子,大家可以参考下

定时任务

基本格式 : 

*  *  *  *  *  command 

分 时   日   月  周   命令 

第1列表示分钟1~59 每分钟用*或者 */1表示 

第2列表示小时1~23(0表示0点) 

第3列表示日期1~31 

第4列表示月份1~12 

第5列标识号星期0~6(0表示星期天) 

第6列要运行的命令 

crontab文件的一些例子: 

30 21 * * * /usr/local/etc/rc.d/lighttpd restart 

上面的例子表示每晚的21:30重启apache。 

45 4 1,10,22 * * /usr/local/etc/rc.d/lighttpd restart 

上面的例子表示每月1、10、22日的4 : 45重启apache。 

10 1 * * 6,0 /usr/local/etc/rc.d/lighttpd restart 

上面的例子表示每周六、周日的1 : 10重启apache。 

0,30 18-23 * * * /usr/local/etc/rc.d/lighttpd restart 

上面的例子表示在每天18 : 00至23 : 00之间每隔30分钟重启apache。 

0 23 * * 6 /usr/local/etc/rc.d/lighttpd restart 

上面的例子表示每星期六的11 : 00 pm重启apache。 

* */1 * * * /usr/local/etc/rc.d/lighttpd restart 

每一小时重启apache 

* 23-7/1 * * * /usr/local/etc/rc.d/lighttpd restart 

晚上11点到早上7点之间,每隔一小时重启apache 

0 11 4 * mon-wed /usr/local/etc/rc.d/lighttpd restart 

每月的4号与每周一到周三的11点重启apache 

0 4 1 jan * /usr/local/etc/rc.d/lighttpd restart 

一月一号的4点重启apache

/n 表示隔n个单位执行一次

/3 * * * * 3分钟执行一次

1 */3 * * * 表示每隔3个小时的第一分钟执行一次

crontab -l显示目前所有的任务

crontab -r删除所有的任务

crontab -e编辑任务

比如说root查看自己的cron设置:crontab -u root -l

再例如,root想删除fred的cron设置:crontab -u fred -r

在编辑cron服务时,编辑的内容有一些格式和约定,输入:crontab -u root -e

在使用之前首先通过which php命令找到自己的php安装到了哪里,西面能用到,我的打印出来是/usr/local/php/bin/php

为了知道自己写的php到底有没有被调用,在php写了一个简单的文件写入函数,我将当前的时间写入到一个test.txt中,只要查看test.txt, 我就知道php是有没有调用,什么时候调用,这样就可以大致看出来,自己设置的调用时间是不是被正确执行了。

定时任务

$fp = fopen("test.txt","a+");  

fwrite($fp, date('y-m-d h:i:s')."****"."\r\n");  

fclose($fp);  

php写好后然后配置crontab:

在命令行输入crontab -e,这时会打开一个文本编辑器,上面显示的是你写入的调用列表,如果以前没有编辑过,则打开文件里面什么都没有

在文件里面输入

定时任务

*/10 * * * * cd /var/www/cron && /usr/local/php/bin/php /var/www/cron/test.php  

然后保存退出

通过shell结合awk可以很好判断某一进程是不是运行,或者某一程序文件是否被执行定义一个crontab,每一分钟执行一次,时间间隔为一分钟,可能下一次执行的时候,上次还没有执行完,所以我们要做一下判断