在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>
- <dict>
- <key>Minute</key>
- <integer>0</integer>
- </dict>
上述设置的意思为每天的每个小时的第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 -r删除所有的任务
crontab -e编辑任务
再例如,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是有没有调用,什么时候调用,这样就可以大致看出来,自己设置的调用时间是不是被正确执行了。
- <?php
- $fp = fopen("test.txt","a+");
- fwrite($fp, date('Y-m-d H:i:s')."****"."\r\n");
- fclose($fp);
- ?>
在命令行输入crontab -e,这时会打开一个文本编辑器,上面显示的是你写入的调用列表,如果以前没有编辑过,则打开文件里面什么都没有
在文件里面输入
- */10 * * * * cd /var/www/cron && /usr/local/php/bin/php /var/www/cron/test.php
通过shell结合awk可以很好判断某一进程是不是运行,或者某一程序文件是否被执行定义一个crontab,每一分钟执行一次,时间间隔为一分钟,可能下一次执行的时候,上次还没有执行完,所以我们要做一下判断