如果要让unix系统重复,定期做一件事,我们就会用到crontab.

实质上真正去执行每一个重复任务的是cron,cron是的unix家族的一个后台常驻程序,cron是由cron文件来驱动的,crontab只是用来管理cron文件的,比如给cron file里面添加任务,删除任务,文件里记录了要执行的任务,以及其"时间规则"

crontab的作用,正如crontab的man文档中写的: maintain crontab files for individual users

crontab提供给我们的接口

我们是不需要去直接编辑cron file,修改查看cron file都应该使用crontab

查看当前用户的cron任务

  >>> crontab -l

如下是我的cron文件,当然写的比较刻意,关于@hourly ,  @daily,参考下一节

编辑当前用户的cron任务

  >>> crontab -e

crontab会去查看EDITOR环境变量,用这个环境变量指定的编辑器来编辑现有的crontab任务,如果这个环境变量为空,就调用默认的/usr/bin/editor,在我的ubuntu机器上,默认的editor指向了/bin/nano,GNU nano也是GNU的一个编辑器,但是我用不太习惯,把它改成了vim.

  >>> export EDITOR="/usr/bin/vim"

这样进去以后就是我熟悉的vim了.

移除cron file

>>> crontab -r

我们可以手动做一下,移除cron file后又装回去,安装使用命令

   >>> crontab file

crontab为每一个用户维护自己的cron file,没有root权限的用户只能查看和修改自己的cron任务.

如果有root权限,那么要查看用户wangyu的cron任务,使用 -u 参数:

>>> crontab -u wangyu -l

cron任务,编写cron表达式

cron file中的每一行代表一个任务,也就是一个cron表达式.

cron表达式语法:

# * * * * *  command to execute
# ┬ ┬ ┬ ┬ ┬
# │ │ │ │ │
# │ │ │ │ │
# │ │ │ │ └───── day of week (0 - 6) (0 to 6 are Sunday to Saturday)
# │ │ │ └────────── month (1 - 12)
# │ │ └─────────────── day of month (1 - 31)
# │ └──────────────────── hour (0 - 23)
# └───────────────────────── min (0 - 59)

前5个field指示时间,最后一个表示要用shell执行的command.

举例:

    *  *  *  echo > /var/log/lq1990/error.log 

就是一天中00:01   01 : 00的时候,清除error.log,而且是一个月的每一天,一年的每一个月,一周的每一天。

假如我们有个python测试脚本/srv/test.py,想每两个小时执行一次,并且是整点,那么应该这么做

 */ * * * /srv/test.py

[例子]

0 * * * *  代表什么?

表示 每个小时的开始第0分钟都执行任务,对于这个时间,有一个预先定义的简写:@hourly. 也就是一个任务语句可以这么写

@hourly  command

0 0 * * *   ?

表示 每一天的00:00重复执行任务.对于这个时间定义也有预定义的简写:@daily.

[思考]

除了以上两个,还有三个预定义表示,分别是@weekly,@monthly,@yearly,其对应的表示是什么?

和crontab/cron有关的配置文件

对于每个系统用户,如果你指定了相应的cron语句,都会在/var/spool/cron/crontabs/下有一个自己的文件,里面就是你的 cron语句,比如对于用户wangyu,就会有这么一个文件 

/var/spool/cron/crontabs/wangyu

我们是不要去直接查看和修改这个文件的,使用crontab.

cron.deny和cron.allow.

两个文件都在/etc/下,默认情况下这两个文件都是没有的.

cron.deny指定了不允许使用crontab的用户,比如我在/etc/下创建cron.deny,并且加上一行wangyu,我的用户名,那当我再使用crontab的时候,出现如下提示:

但当我创建/etc/cron.allow,并且把我的用户名放进去以后,我又可以使用crontab了

当然把系统的用户放进/etc/cron.deny以后,用户只是不能使用crontab了,之前这个用户添加的cron任务还是会一直执行的,可能因为cron和crontab是分开的,cron是不管哪个系统用户设置的任务的.

更复杂一点的cron表达式

正如下面@斯诺登同学所提到的,写这篇文章的时候是11月,如果我们要在12月,每天7-24点,每间隔10分钟执行一个任务应该怎么做?

*/  -  *    *   command

这里我们使用了一些特殊字符

"-" 表示取值区间,    * 表示该filed的所有值, 而 "/" 表示步长, 所以 */10 就表示 0-59 ,且从0开始每增加10重复做一次.

[思考]

上面是规定了12月做这件事, 我还没有想到,如果要求从下个月1号开始,按照某个规律重复一件事,应该怎么做,可以做到没?

------------

参考:

http://en.wikipedia.org/wiki/Cron

cron 的 man page.

Linux的crontab的更多相关文章

  1. 【转】PHP计划任务:如何使用Linux的Crontab执行PHP脚本

    转:https://www.centos.bz/2011/03/auto-run-task-crontab/ 我们的PHP程序有时候需要定时执行,我们可以使用ignore_user_abort函数或是 ...

  2. 如何让linux定时任务crontab按秒执行

    如何让linux定时任务crontab按秒执行? linux定时任务crontab最小执行时间单位为分钟如果想以秒为单位执行,应该如何设置呢?思路 正常情况是在crontab中直接定义要执行的任务,现 ...

  3. Linux shell crontab expdp 定时任务逻辑备份 定时删除旧文件

    点击进入:Window bat expdp 定时任务逻辑备份 定时删除N天前的旧文件 创建sh脚本 [oracle@localhost ~]$ vi logicbackup.sh 添加脚本内容 #!/ ...

  4. 如何使用Linux的Crontab定时执行PHP脚本的方法

    我们的PHP程序有时候需要定时执行,我们可以使用ignore_user_abort函数或是在页面放置js让用户帮我们实现.但这两种方法都不太可靠,不稳定.我们可以借助Linux的Crontab工具来稳 ...

  5. linux定时任务crontab

    今天在执行mysql定时任务语句时候问了很多大拿,都建议我不要随便在生产环境下写定时任务这样的语句,有的说会有延时,那样的话就不准了,有的说在.系统时间和本地时间不一致怎么办?后来就建议我用linux ...

  6. Linux 命令 - crontab: 任务调度

    cron 是一个 Linux 下的定时执行工具,可以在无需人工干预的情况下运行作业.守护进程 cron 会读取 crontab 文件,根据配置在指定的时间执行任务.contab 命令用来添加.删除.显 ...

  7. linux使用crontab -e 遇到No space left on device

    今天用linux的crontab -e编辑定时脚本的时候.遇到No space left on device的错误. 网上找了半天终于知道原因了,昨天晚上我的一个任务因为路径没写对,到时crontab ...

  8. PHP计划任务:如何使用Linux的Crontab执行PHP脚本

    我们的PHP程序有时候需要定时执行,我们可以使用ignore_user_abort函数或是在页面放置js让用户帮我们实现.但这两种方法都不太可靠,不稳定.我们可以借助Linux的Crontab工具来稳 ...

  9. linux定时任务crontab的设置

    linux定时任务crontab的设置http://www.blogjava.net/freeman1984/archive/2010/09/23/332715.html vi /etc/cronta ...

  10. CentOS Linux使用crontab运行定时任务详解

    参考博文: (总结)CentOS Linux使用crontab运行定时任务详解

随机推荐

  1. 《C++ Primer Plus》14.3 多重继承 学习笔记

    多重继承(MI)描述的是有多个直接基类的类.与单继承一样,共有MI表示的也是is-a关系.例如,可以从Awiter类和Singer类派生出SingingWaiter类:class SingingWai ...

  2. PHP之命名空间

    前面的话 从广义上来说,命名空间是一种封装事物的方法.在很多地方都可以见到这种抽象概念.例如,在操作系统中目录用来将相关文件分组,对于目录中的文件来说,它就扮演了命名空间的角色.这个原理应用到程序设计 ...

  3. WEB安全番外第一篇--其他所谓的“非主流”漏洞:URL跳转漏洞与参数污染

    一.URL跳转篇: 1.原理:先来看这段代码: <?php if(isset($_GET["url_redircetion_target"])){ $url_redirect ...

  4. chrome单步调试代码

    单步调试代码 所有步骤选项均通过边栏中的可点击图标 表示,但也可以通过快捷键触发(鼠标悬停在操作图标上就可以看到快捷键).下面是简要介绍: 图标/按钮 操作 描述 Resume 继续执行直到下一个断点 ...

  5. Egret打包App Android热更新(4.1.0)

    官网教程:http://developer.egret.com/cn/github/egret-docs/Native/native/hotUpdate/index.html 详细可看官网教程,我这里 ...

  6. 【BZOJ1096】[ZJOI2007]仓库建设 斜率优化

    [BZOJ1096][ZJOI2007]仓库建设 Description L公司有N个工厂,由高到底分布在一座山上.如图所示,工厂1在山顶,工厂N在山脚.由于这座山处于高原内陆地区(干燥少雨),L公司 ...

  7. Python - 3.6 学习四

    错误.调试和测试 程序运行中,可能会遇到BUG.用户输入异常数据以及其它环境的异常,这些都需要程序猿进行处理.Python提供了一套内置的异常处理机制,供程序猿使用,同时PDB提供了调试代码的功能,除 ...

  8. 最小圆覆盖(随机增量法&模拟退火法)

    http://acm.hdu.edu.cn/showproblem.php?pid=3007 相关题型连接: http://acm.hdu.edu.cn/showproblem.php?pid=393 ...

  9. javascript飞机大战-----005创建子弹对象2

    子弹销毁 /* 创建子弹:因为子弹不是只创建一个所以要用构造函数 注意一点:子弹发射的位置应该是英雄机的正中央的位置,所以需要传点东西进来 */ function Bullet(l,t){ this. ...

  10. Redis集群管理(二)

    1.进入集群客户端 任意选一个redis节点,进入redis 所在目录 cd /redis 所在目录/src/ ./redis-cli -h 本地节点的ip -p redis的端口号 -a 密码 [r ...