定时任务

简介:

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

PHP版的定时任务

Java代码   收藏代码
  1. <?php  
  2. $a = time();  
  3. ignore_user_abort(); //关掉浏览器,PHP脚本也可以继续执行.  
  4. set_time_limit(3000); // 通过set_time_limit(0)可以让程序无限制的执行下去  
  5. $interval = 5// 每隔5s运行   
  6. while(1) {  
  7.     sleep($interval);  
  8.     //查询订单接口  
  9.     echo $i . "---" . (time() - $a) . "<br/>";  
  10. }  
  11. ?>  

Mac

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

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

一个简单例子如下:

Java代码   收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">  
  3. <plist version="1.0">  
  4. <dict>  
  5.     <key>Label</key>  
  6.     <string>com.yangyz.cron.test.plist</string>  
  7.     <key>ProgramArguments</key>  
  8.     <array>  
  9.         <string>/Users/yangyz/plist-test.sh</string>  
  10.     </array>  
  11.     <key>KeepAlive</key>  
  12.     <false/>  
  13.     <key>RunAtLoad</key>  
  14.     <true/>  
  15.     <key>StartInterval</key>  
  16.     <integer>60</integer>  
  17. </dict>  
  18. </plist>  

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

Java代码   收藏代码
  1. <key>StartCalendarInterval</key>  
  2. <dict>  
  3.   <key>Minute</key>  
  4.   <integer>0</integer>  
  5. </dict>  

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

 

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

Java代码   收藏代码
  1. #停止脚本com.yangyz.cron.test.plist运行  
  2. launchctl unload /Library/LaunchDaemons/com.yangyz.cron.test.plist   
  3.   
  4. #启动脚本com.yangyz.cron.test.plist运行  
  5. 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是有没有调用,什么时候调用,这样就可以大致看出来,自己设置的调用时间是不是被正确执行了。

Java代码   收藏代码
  1. <?php  
  2. $fp = fopen("test.txt","a+");  
  3. fwrite($fp, date('Y-m-d H:i:s')."****"."\r\n");  
  4. fclose($fp);  
  5. ?>  
php写好后然后配置crontab:
在命令行输入crontab -e,这时会打开一个文本编辑器,上面显示的是你写入的调用列表,如果以前没有编辑过,则打开文件里面什么都没有
在文件里面输入
Java代码   收藏代码
  1. */10 * * * * cd /var/www/cron && /usr/local/php/bin/php /var/www/cron/test.php  
然后保存退出

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

相关文章
|
2月前
|
Linux Shell 开发工具
什么是crontab定时任务?
定时任务在Linux系统中用的是比较多的,个人的话一般用的很少,在企业中定时任务是必不可少的,定时任务多种多样,有程序的定时任务,比如:写一个程序在程序内定时执行,或者是操作系统的定时任务,比如:Windows系统的定时任务、Linux系统的定时任务,他们的名称、操作方式都不相同,但是他们都有一个共同的特征,在**某个特定的时间或者时间段执行某项任务**,这类通常被我们称之为定时任务,再举个例子,我们手机的闹钟、或者街边的路灯,这些都是定时任务,闹钟会在早上7点发出音乐,路灯会在晚上6点开灯,这些都是生活中的定时任务,今天记录一下在Linux系统中如何使用定时任务
什么是crontab定时任务?
|
3月前
|
消息中间件 Java 中间件
定时任务的六种策略
这篇文章,我们聊聊实现定时任务的六种策略。
|
7月前
|
Linux 数据库
定时任务
定时任务
105 0
|
7月前
|
消息中间件 算法 Java
定时任务实现方案总结
定时任务实现方案总结
58 0
定时任务实现方案总结
|
9月前
|
Java BI Spring
定时任务和异步任务
定时任务和异步任务
|
9月前
|
关系型数据库 MySQL 调度
定时任务优化
简单描述一下定时任务的优化
96 0
|
10月前
|
负载均衡 Java 数据挖掘
定时任务实现的几种方式
定时任务实现的几种方式
235 1
|
Unix Linux Shell
cron设置定时任务详解
cron设置定时任务详解
|
Java Spring
使用定时任务 随着项目启动定时执行
使用定时任务 随着项目启动定时执行
264 0
|
Java 调度 开发者
定时任务|学习笔记
快速学习定时任务
80 0