zoukankan      html  css  js  c++  java
  • linux的计划任务

    本文说的计划任务是指Linux的Cronjob。
    语法 
    下面是个简单的计划任务:

    10 * * * * /usr/bin/php /www/virtual/username/cron.php > /dev/null 2>&1

    它主要有两部分组成:
    1.”10 * * * *” ,这是定时器。
    2.其他部分是命令,它们会在命令行运行。

    这个例子中,命令本身又有三个部分:
    1.”/usr/bin/PHP”。PHP脚本通常不会自己执行,它需要通过PHP解析器来执行。
    2.”/www/virtual/username/cron.php”。这个是需要执行的脚本的路径。
    3.”> /dev/null 2>&1″。这部分是处理脚本的输出的。稍后我们详细说它。

    定时器语法 
    就是上面计划任务的第一部分。它决定了何时执行计划任务。
    它包含5部分:
    1.分钟(0-59)
    2.小时(0-23)
    3.一个月的哪一天(1-31)
    4.一年中的哪个月(1-12)
    5.星期几(0是星期天)

    星号 
    如果某个部分出现的是星号而不是数字,就是说明这个部分表示的时间全部会执行。
    不太容易说清楚,看例子吧。

    示例: 
    下面的计划任务会一直运行

    * * * * * [command]

    下面的计划任务会在每个小时的0分时运行(就是每小时执行一次)

    0 * * * * [command]

    下面依旧是一个每小时运行一次的计划任务。不过是在每个小时的一刻钟时运行的(1:15,2:15.。。)

    15 * * * * [command]

    下面的计划任务每天执行一次,在2:30分

    30 2 * * * [command]

    下面的计划任务是在每个月2号的午夜执行(比如:2010年2月2日00:00)

    0 0 2 * * [command]

    下面的计划任务会在每周一的每个小时0分钟时执行一次

    0 * * * 1 [command]

    下面的会每小时运行3次,在0分,10分,和20分时

    0,10,20 * * * * [command]

    下面是用除号“/”表示每多少运行一次。本例是每5分钟运行一次

    */5 * * * * [command]

    还可以用“-”表示一个范围,如下表示5到10点的每个整点运行一次

    0 5-10 * * * [command]

    另外还有一个特殊的时间关键字“@reboot”,就是每次重启服务器时运行计划任务

    @reboot [command]

    设定和管理计划任务 
    编辑Crontab,来设定计划任务。使用下面的命令,会在vi里打开crontab的内容以供编辑:

    crontab -e

    如果你只想看看,不需要编辑,可以使用以下的命令

    crontab -l

    要删除crontab的内容,就是删除所有的计划任务,可以这样:

    crontab -r

    系统会询问“remove crontab for 用户名?”你敲下y,就删除了用户的crontab了

    通过载入文件来设立计划任务

    crontab cron.txt

    这个要谨慎,因为这将会覆盖掉原本的计划任务的内容。

    注释 
    注释使用#字符。例如:

    # This cron job does something very important   
    10 * * * * /usr/bin/php /www/virtual/username/cron.php > /dev/null 2>&1

    设定E-mail 
    默认情况下,计划任务的输出会发送到email,除非你取消他,或是定向到一个文件。这样设定MAILTO:

    MAILTO="username@example.com"  
    # This cron job does something very important   
    10 * * * * /usr/bin/php /www/virtual/username/cron.php > /dev/null 2>&1

    使用PHP解析器 
    CGI脚本默认是可以执行的,但是php脚本不行。他们需要用php解析器来运行。这就是我们要把php解析器的路径放到php脚本前的原因。

    * * * * * /usr/bin/php [path to php script]

    有时候php解析器可能在这里”/usr/local/bin/php”。我们可以用下面的命令找到正确的路径:
    输入:which php
    系统反馈:/usr/local/bin/php

    ok,我们就知道php解析器的路径了。

    处理输出 
    如果你不处理输出,它们会发送mail到你的服务器账号里。

    如果你在命令行尾添加”> /dev/null 2>&1″,输出将会丢弃。(其他命令后面接它也会丢弃输出)。

    $ /usr/local/bin/php hello.php
    Hello world
    $ /usr/local/bin/php hello.php > /dev/null 2>&1
    $

    大于号(>)用于重定向输出。”/dev/null”是个空设备,输出到那里就会忽略掉。
    “2>&1″是标准错误输出,定向到标准输出。也是到”/dev/null”.

    输出到文件 
    输出到文件也是用的大于号“>”.

    10 * * * * /usr/bin/php /www/virtual/username/cron.php > /var/log/cron.log

    这将会每次都覆盖原来的输出。如果你想要的是追加到以前的输出后面,可以用两个大于号”>>”来处理。

    10 * * * * /usr/bin/php /www/virtual/username/cron.php >> /var/log/cron.log

    可执行脚本 
    你可以把php脚本当成CGI一样的来运行。只需要在开头的地方加上一行php解析器的路径(hello.php):

    #!/usr/local/bin/php   
    <?php  
      
    echo "hello world/n";  
      
    // ...  
      
    ?>

    再设置一下权限,使之可执行,比如chmod到755.
    比如上面的hello.php,再 “chmod 755 hello.php”
    直接运行:

    $ ./hello.php
    Hello world
    $

    这时,你的计划任务就可以这样写了

    10 * * * * /www/virtual/username/hello.php

    防止定时任务撞车 
    比如,你有一个每分钟都运行的计划任务,但是这个任务这分钟没有运行完成,下一分钟的计划任务也已经开始了。。这样也许会崩溃我们的服务器的。
    我们可以通过文件锁来解决:

    $fp = fopen('/tmp/lock.txt', 'r+');   
    if(!flock($fp, LOCK_EX | LOCK_NB)) {   
        echo 'Unable to obtain lock';   
        exit(-1);   
    }   
    /* ... */  
    fclose($fp);

    过程:打开文件,判断文件是否锁定,锁定了就退出。这样第一个计划任务没运行结束时,文件不会关闭,也就没有解锁。
    下一个时间触发的计划任务,也尝试打开文件,发现已被锁定,于是退出。这样就不会撞车了。

    组织web访问计划任务 
    如果你用php写了计划任务,那你要保证其他人不可以从web访问到它。简单的方法是把这些脚本放到web目录外。
    如果无法放到web目录外,可以在计划任务要执行的脚本的目录下,用.htaccess 文件控制:

    deny from all

    你也可以在php脚本里限制:

    if (isset($_SERVER['REMOTE_ADDR'])) die('Permission denied.');

    这将保证,如果是从网络来的,会立即停止php脚本的执行。

  • 相关阅读:
    poj 2485 Highways 最小生成树
    hdu 3415 Max Sum of MaxKsubsequence
    poj 3026 Borg Maze
    poj 2823 Sliding Window 单调队列
    poj 1258 AgriNet
    hdu 1045 Fire Net (二分图匹配)
    poj 1789 Truck History MST(最小生成树)
    fafu 1181 割点
    减肥瘦身健康秘方
    人生的问题
  • 原文地址:https://www.cnblogs.com/Pxhphp/p/6485778.html
Copyright © 2011-2022 走看看