Linux操作系统定时任务系统Cron入门、PHP计划任务以及rpc示例

一、简单介绍

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();
?>

 

 

posted on 2015-10-16 17:37  爱漂泊人生  阅读(543)  评论(0编辑  收藏  举报

导航