zoukankan      html  css  js  c++  java
  • linux计划任务 学习笔记

    原文链接: http://www.tsingfeng.com/?tag=cronjob

    本文说的计划任务是指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脚本的执行。

  • 相关阅读:
    Linux内核之数据双链表
    程序员必读:Linux内存管理剖析
    大型网站系统架构演化之路
    高流量站点NGINX与PHP-fpm配置优化
    LVS负载均衡集群服务搭建详解(二)
    LVS负载均衡集群服务搭建详解(一)
    安装 openSUSE Leap 42.1 之后要做的 8 件事
    【Linux基础】VI命令模式下删除拷贝与粘贴
    【Linux基础】VI命令模式下大小写转换
    【Linux基础】VI 编辑器基本使用方法
  • 原文地址:https://www.cnblogs.com/clphp/p/5017015.html
Copyright © 2011-2022 走看看