一、简单介绍
1、cron是一个linux下的定时执行工具,可以在无需人工干预的情况下运行作业。由于Cron 是Linux的内置服务,但它不自动起来,可以用以下的方法启动、关闭这个服务:
service cron start //启动服务
service cron stop //关闭服务
service cron restart //重启服务
service cron reload //重新载入配置
2、直接用crontab命令编辑
cron服务提供crontab命令来设定cron服务的,以下是这个命令的一些参数与说明:
crontab -u //设定某个用户的cron服务,一般root用户在执行这个命令的时候需要此参数;
crontab -l //列出某个用户cron服务的详细内容;
crontab -r //删除没个用户的cron服务;
crontab -e //编辑某个用户的cron服务。
root查看自己的cron设置:crontab -u root -l
root想删除fred的cron设置:crontab -u fred -r
在编辑cron服务时,编辑的内容有一些格式和约定,输入:sudo crontab -u root -e
no crontab for root - using an empty one
Select an editor. To change later, run 'select-editor'.
1. /bin/ed
2. /bin/nano <---- easiest
3. /usr/bin/emacs23
4. /usr/bin/vim.basic
5. /usr/bin/vim.tiny
Choose 1-5 [2]: 4
# Edit this file to introduce tasks to be run by cron.
#
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
#
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').#
# Notice that tasks will be started based on the cron's system
# daemon's notion of time and timezones.
#
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
#
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
#
# For more information see the manual pages of crontab(5) and cron(8)
#
# m h dom mon dow command
~
"/tmp/crontab.gGWVZX/crontab" 22L, 888C
ok 进入vi编辑模式,编辑的内容一定要符合下面的格式:*/1 * * * * ls >> /tmp/ls.txt
二、语法
1、linux任务调度的工作主要分为以下两类:
*系统执行的工作:系统周期性所要执行的工作,如备份系统数据、清理缓存
*个人执行的工作:某个用户定期要做的工作,例如每隔10分钟检查邮件服务器是否有新信,这些工作可由每个用户自行设置。
2.crontab命令选项:
-u 指定一个用户,
-l 列出某个用户的任务计划,
-r 删除某个用户的任务,
-e 编辑某个用户的任务
3.cron文件语法:
分 小时 日 月 星期 命令
0-59 0-23 1-31 1-12 0-6 command (取值范围,0表示周日一般一行对应一个任务)
4.记住几个特殊符号的含义:
"*"代表取值范围内的数字,
"/"代表"每",
"-"代表从某个数字到某个数字,
","分开几个离散的数字
三、任务调度设置文件的写法
1、可用crontab -e命令来编辑,编辑的是/var/spool/cron下对应用户的cron文件,也可以直接修改/etc/crontab文件,具体格式如下:
Minute Hour Day Month Dayofweek command
分钟 小时 天 月 天每星期 命令
2、每个字段代表的含义如下:
Minute 每个小时的第几分钟执行该任务
Hour 每天的第几个小时执行该任务
Day 每月的第几天执行该任务
Month 每年的第几个月执行该任务
DayOfWeek 每周的第几天执行该任务
Command 指定要执行的程序
在这些字段里,除了“Command”是每次都必须指定的字段以外,其它字段皆为可选字段,可视需要决定。对于不指定的字段,要用“*”来填补其位置。
3、举例如下:
5 * * * * ls 指定每小时的第5分钟执行一次ls命令
30 5 * * * ls 指定每天的 5:30 执行ls命令
30 7 8 * * ls 指定每月8号的7:30分执行ls命令
30 5 8 6 * ls 指定每年的6月8日5:30执行ls命令
30 6 * * 0 ls 指定每星期日的6:30执行ls命令[注:0表示星期天,1表示星期1,以此类推,也可以用英文来表示,sun表示星期天,mon表示星期一等。]
30 3 10,20 * * ls 每月10号及20号的3:30执行ls命令[注:“,”用来连接多个不连续的时段]
25 8-11 * * * ls 每天8-11点的第25分钟执行ls命令[注:“-”用来连接连续的时段]
*/15 * * * * ls 每15分钟执行一次ls命令 [即每个小时的第0 15 30 45 60分钟执行ls命令 ]
30 6 */10 * * ls 每个月中,每隔10天6:30执行一次ls命令[即每月的1、11、21、31日是的6:30执行一次ls命令。 ]
每天7:50以root 身份执行/etc/cron.daily目录中的所有可执行文件
50 7 * * * root run-parts /etc/cron.daily [ 注:run-parts参数表示,执行后面目录中的所有可执行文件。 ]
四、新增调度任务
新增调度任务可用两种方法:
1、在命令行输入: crontab -e 然后添加相应的任务,:wq存盘退出。
2、直接编辑/etc/crontab 文件,即vi /etc/crontab,添加相应的任务。
五、查看调度任务
crontab -l //列出当前的所有调度任务
crontab -l -u user //列出用户user的所有调度任务
六、删除任务调度工作
crontab -r //删除所有任务调度工作
七、任务调度执行结果的转向
例1:每天5:30执行ls命令,并把结果输出到/tmp/test文件中
30 5 * * * ls >/tmp/test 2>&1
注:2>&1 表示执行结果及错误信息。
当程序在你所指定的时间执行后,系统会寄一封信给你,显示该程序执行的内容,若是你不希望收到这样的信,请在每一行空一格之
后加上 > /dev/null 2>&1 即可
八、编辑/etc/crontab 文件配置cron
cron服务每分钟不仅要读一次/var/spool/cron内的所有文件,还需要读一次/etc/crontab,因此我们配置这个文件也能运用
cron服务做一些事情。用crontab配置是针对某个用户的,而编辑/etc/crontab是针对系统的任务。
此文件的文件格式是:
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root //如果出现错误,或者有数据输出,数据作为邮件发给这个帐号
HOME=/ //使用者运行的路径,这里是根目录
# run-parts
01 * * * * root run-parts /etc/cron.hourly //每小时执行/etc/cron.hourly内的脚本
02 4 * * * root run-parts /etc/cron.daily //每天执行/etc/cron.daily内的脚本
22 4 * * 0 root run-parts /etc/cron.weekly //每星期执行/etc/cron.weekly内的脚本
42 4 1 * * root run-parts /etc/cron.monthly //每月去执行/etc/cron.monthly内的脚本
大家注意"run-parts"这个参数了,如果去掉这个参数的话,后面就可以写要运行的某个脚本名,而不是文件夹名了
例如: 1、在命令行输入: crontab -e 然后添加相应的任务,wq存盘退出。
2、直接编辑/etc/crontab 文件,即vi /etc/crontab,添加相应的任务
11 2 21 10 * rm -rf /mnt/fb
前四行是用来配置 cron 任务运行环境的变量:
SHELL 变量的值指定shell 环境(此处默认为 bash shell);PATH 变量定义用来执行命令的程序路径;cron 任务的输出被邮寄给 MAILTO 变量定义的用户名,如果 MAILTO 变量被定义为空白字符串(MAILTO=""),电子邮件就不会被寄出;HOME 变量可以用来设置在执行命令或脚本时使用的主目录。
如在 /etc/crontab 文件中run-parts部分所示,它使用 run-parts 脚本来执行存在于 /etc/cron.hourly、/etc/cron.daily、/etc/cron.weekly 和 /etc/cron.monthly 目录中的脚本,这些脚本被相应地按照预设时间在每小时、每日、每周、或每月执行。这些目录中的文件应该是 shell 脚本,并且具有可执行权限(chmod +x filename)。
如果某 cron 任务需要根据调度来执行,而不是每小时、每日、每周、或每月地执行,它可以被添加到/etc/cron.d目录中。该目录中的所有文件使用和 /etc/crontab 中一样的语法。
每次编辑完某个用户的cron设置后,cron自动在/var/spool/cron下生成一个与此用户同名的文件,此用户的cron信息都记录在 这个文件中,这个文件是不可以直接编辑的,只可以用crontab -e 来编辑。cron启动后每过一份钟读一次这个文件,检查是否要执行里面的命令。因此此文件修改后不需要重新启动cron服务。
ubuntu 重设crontab -e的默认编辑器
sudo select-editor 选择vim 搞定
PHP实现定时执行计划任务
使用php让浏览器刷新需要解决几个问题
PHP脚本执行时间限制,默认的是30m 解决办法:set_time_limit();或者修改PHP.ini 设置max_execution_time时间(不推荐)
如果客户端浏览器关闭,程序可能就被迫终止,解决办法:ignore_user_abort即使关闭页面依然正常执行
如果程序一直执行很有可能会消耗大量的资源,解决办法使用sleep使用程序休眠一会,然后在执行
PHP定时执行的代码:
<?php
ignore_user_abort();//关掉浏览器,PHP脚本也可以继续执行.
set_time_limit(3000);// 通过set_time_limit(0)可以让程序无限制的执行下去
$interval=5;// 每隔5s运行
//方法1--死循环
do{
echo '测试'.time().'<br/>';
sleep($interval);// 等待5s
}while(true);
//方法2---sleep 定时执行
require_once './curlClass.php';//引入文件
$curl = new httpCurl();//实例化
$stime = $curl->getmicrotime();
for($i=0;$i<=10;$i++){
echo '测试'.time().'<br/>';
sleep($interval);// 等待5s
}
ob_flush();
flush();
$etime = $curl->getmicrotime();
echo '<hr>';
echo round(($etime-stime),4);//程序执行时间
九、PHP计划任务
1、在Crontab中使用PHP执行脚本
就像在Crontab中调用普通的shell脚本一样,使用PHP程序来调用PHP脚本。
每分钟执行test.php一次如下:
- # crontab -e
- 00 * * * * php /var/www/test.php >> /var/www/test.log
/usr/local/bin/php为PHP程序的路径。
>> /var/www/test.log 是记录计划任务的日记的。
实例:1.
计划任务:*/ * * * * php /var/www/test.php >> /var/www/test.log(php调用php脚本的计划任务的实例)
test.php
<?php
set_time_limit(0);
echo "hello ";
test.log
hello //每分钟执行一次
按正常的方式写PHP,然后在第一行前加一行"#!/usr/local/bin/php -q" 这里要指向本机PHP的安装目录,如果不知道。可以通过:find / -type f -name 'php' 来查找。
#!/usr/local/bin/php -q
<?
$file = '/htdocs/www/b100/egspace/Bin/test/'.date('H').'-'.date('i').'-'.date('s').'.txt';
file_put_contents($file,date('Y-m-d'));
?>
把PHP文件属性改为shell文件。
chmod +x test.php
或:chmod 755 test.php
再编辑crontab
crontab -e
或:crontag -u www -e
加上一行
*/1 * * * * /htdocs/www/b100/egspace/Bin/test.php
实验证明,如果在文件最前面不加那一句话:#!/...
-q 也是可以的.不过,在计划任务中得如下写:
*/1 * * * * /usr/bin/php
/htdocs/www/b100/egspace/Bin/test.php
通常会碰到的问题有:
1.没有执行的权限。通过 chmod 改变文件的权限,或对文件所属用户进行计划任务的设置。
2.文件没有执行权限。通过 chmod +x filename 为文件加上执行权限。
3.如果要在文件中对其他文件进行写,删除等操作,要将目标文件的权限进行相应的设置。
4.环境变量的问题。最隐藏的问题。用crontab来执行php,是不走apache,nginx,所以$_SERVER,$_ENV这类变量根本用不了。所以检查一下php代码中有没有这类变量,如果有,拿掉。
5.php的相对路径问题.如:
include_once'./mysql.php';
当php代码中,用的是相对路径时,只有进入到那个目录下执行/usr/local/php/bin/php
/var/www/cron/level_rank.php才能生效。解决方法如下:
*/10 * * * * cd /var/www/cron
&& /usr/local/php/bin/php
/var/www/cron/level_rank.php
或者在php代码中用绝对路径.
附:
可以查看 crond
的日志文件来了解失败的原因,默认情况下日志文件是:/var/logs/crond
也可以为某个计划任务指定日志输入文件。例如:
*/10 * * * * /usr/local/php/bin/php
/var/www/cron/del_redis.php >>
/home/wwwlogs/del.log
2、在Crontab中使用URL执行脚本
如果你的PHP脚本可以通过URL触发,你可以使用lynx或curl或wget来配置你的Crontab。
下面的例子是使用Lynx文本浏览器访问URL来每小时执行PHP脚本。Lynx文本浏览器默认使用对话方式打开URL。但是,像下面的,我们在lynx命令行中使用-dump选项来把URL的输出转换来标准输出。
-
00 * * * * lynx -dump https://www.centos.bz/myscript.php
下面的例子是使用CURL访问URL来每5分执行PHP脚本。Curl默认在标准输出显示输出。使用”curl -o”选项,你也可以把脚本的输出转储到临时文件。
-
*/5 * * * * /usr/bin/curl -o temp.txt https://www.centos.bz/myscript.php
下面的例子是使用WGET访问URL来每10分执行PHP脚本。-q选项表示安静模式。”-O temp.txt”表示输出会发送到临时文件。
-
*/10 * * * * /usr/bin/wget -q -O temp.txt https://www.centos.bz/myscript.php
十、RPC
RPC是远程过程调用协议,采用客户机/服务器模式。请求程序就是一个客户机,而服务提供程序就是一个服务器。具体看例子(需要借助RPC插件)。
客户端:
<?php
header("content-type:text/html; charset=utf-8");
include 'phprpc/phprpc_client.php';
$client = new PHPRPC_Client('http://localhost/phprpc/server/server.php');
$return = $client->sum(1, 1);
echo $return;
?> |
服务端:
<?php
header("content-type:text/html; charset=utf-8");
include 'phprpc/phprpc_server.php';
function sum( $a, $b )
{
return "从服务器接收到的数据:" . ($a + $b);
}
$server = new PHPRPC_Server();
$server->add('sum');
$server->start();
?> |