zoukankan      html  css  js  c++  java
  • 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();
    ?>

     

  • 相关阅读:
    第01组 Beta冲刺(4/5)
    第01组 Beta冲刺(3/5)
    第01组 Beta冲刺(2/5)
    第01组 Beta冲刺(1/5)
    2019 SDN上机第6次作业
    2019 SDN阅读作业(2)
    2019 SDN上机第5次作业
    第01组 Alpha事后诸葛亮
    第01组 Alpha冲刺(6/6)
    团队作业第三次—项目需求分析
  • 原文地址:https://www.cnblogs.com/aipiaoborensheng/p/4885901.html
Copyright © 2011-2022 走看看