原文链接: 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计划任务 学习笔记的更多相关文章

  1. Linux进程间通信IPC学习笔记之同步二(SVR4 信号量)

    Linux进程间通信IPC学习笔记之同步二(SVR4 信号量)

  2. Linux进程间通信IPC学习笔记之同步二(Posix 信号量)

    Linux进程间通信IPC学习笔记之同步二(Posix 信号量)

  3. Linux进程间通信IPC学习笔记之消息队列(SVR4)

    Linux进程间通信IPC学习笔记之消息队列(SVR4)

  4. Linux进程间通信IPC学习笔记之有名管道

    基础知识: 有名管道,FIFO先进先出,它是一个单向(半双工)的数据流,不同于管道的是:是最初的Unix IPC形式,可追溯到1973年的Unix第3版.使用其应注意两点: 1)有一个与路径名关联的名 ...

  5. Linux进程间通信IPC学习笔记之管道

    基础知识: 管道是最初的Unix IPC形式,可追溯到1973年的Unix第3版.使用其应注意两点: 1)没有名字: 2)用于共同祖先间的进程通信: 3)读写操作用read和write函数 #incl ...

  6. Linux防火墙iptables学习笔记(三)iptables命令详解和举例[转载]

     Linux防火墙iptables学习笔记(三)iptables命令详解和举例 2008-10-16 23:45:46 转载 网上看到这个配置讲解得还比较易懂,就转过来了,大家一起看下,希望对您工作能 ...

  7. linux基础命令学习笔记(二)

    linux基础命令学习笔记(二) 1.kill :终止进程  kill pid (唯一标示一个进程) kill -9  强制终止  kill -15 命令未结束不能终止 # ps aux 查看所有进程 ...

  8. 兄弟连Linux运维学习笔记

    最新经典linux运维兄弟连Linux运维学习笔记... --------------- 全程1.5倍播放.加油我一定可以学完Linux----------------------Unix与Linux ...

  9. Linux shell 菜鸟学习笔记....

    20171123 Linux shell 基础学习笔记1. shell 的开始 一般是 #!/bin/bash 通过 #! 来唯一指定使用的shell路径 其他的 # 都表示注释.2. shell 的 ...

随机推荐

  1. Java并发编程(十)死锁

    哲学家进餐问题 并发执行带来的最棘手的问题莫过于死锁了,死锁问题中最经典的案例就是哲学家进餐问题:5个哲学家坐在一个桌子上,桌子上有5根筷子,每个哲学家的左手边和右手边各有一根筷子.示意图如下: 哲学 ...

  2. A - Chess Placing CodeForces - 985A

    You are given a chessboard of size 1 × n. It is guaranteed that n is even. The chessboard is painted ...

  3. Hadoop相关笔记

    一.            Zookeeper( 分布式协调服务框架 ) 1.    Zookeeper概述和集群搭建: (1)       Zookeeper概述: Zookeeper 是一个分布式 ...

  4. golang总结-并发

    目录 2.7 并发编程 go协程 go管道 2.7 并发编程 go协程 golang 通过一个go关键字就可以开启一个协程. func main() { //两个交错输出 go sayHello() ...

  5. 我一个自己的关于II和&&的逻辑判断(傻逼型)

    原因 首先概述下起始原因:本来埋点的数据中传递来的URL只有http://开头的数据,所以上一个编写此程序的人在定义产品ID和出发口岸时加了这样的判断 然后...悲剧(傻逼)开始了 因为业务需求,埋点 ...

  6. Ruby中Enumerable模块的一些实用方法

    我在查看 Array 类和 Hash 类的祖先链的时候都发现了 Enumerable,说明这两个类都mixin了Enumerable模块.Enumerable模块为集合型类提供了遍历.检索.排序等方法 ...

  7. 实验吧 Fair Play

    知识点:playfair密码以前没见过 Playfair密码(英文:Playfair cipher 或 Playfair square)是一种使用一个关键词方格来加密字符对的加密法,1854年由查尔斯 ...

  8. BZOJ4049][CERC2014]Mountainous landscape-[线段树+凸包+二分]

    Description 现在在平面上给你一条折线P1P2P3...Pn. x坐标是严格单调递增的.对于每一段折线PiPi+1,请你找一个最小的j,使得j>i且走在PiPi+1的人能看到折线PjP ...

  9. c++ 结束程序的几种方式

    abort exit 一.用abort()结束程序 用abort()表示非正常结束程序.如果要正常结束程序得用exit() 二.用exit()结束程序 用exit()它可以使程序正常结束,这个函数 ...

  10. 【Unity3d】WWW类发起web连接

    初学unity3d,解决一个游戏与web服务器连接问题. 看了项目中原始代码,发现每次之前的程序员每次调用WWW类都需要写一遍StartCoroutine,然后各种重复代码. 于是写了一个简单的封装类 ...