crontab的原理及使用

转载 2011年01月19日 11:10:00

#!/bin/sh

CRONTAB_COMMAND="* * * * * /usr/local/watch/start_watch.sh"

echo  "${CRONTAB_COMMAND}" >> /var/spool/cron/tabs/root

 

======================================================

 

在过去cron 仅仅牵涉到一两个文件的时候比较简单,你只需要编辑下文件,然后cron做剩下所有的工作。现在cron变成好几个文件和 好几个程序,看起来比较复杂,幸好有人做了一个简单的界面来应付新的复杂性。

 

Cron 实际上是两个独立的程序。Cron damon, 或者叫做cron ,crond 它是伴随系统一起启动的常驻程序

 

来检查是否cron 在系统上运行, 用ps 命令 和 grep 过滤所需内容:

 

ps -ef|grep cron 

root    387      1   0   Jun 29 ?     00:00:00 crond 

root  32304  20607   0   00:18 pts/0  00:00:00 grep cron 

 

进程 crond 每分钟激活一次,检查cron 文件列表,那里面记录着什么程序应该在什么时间来运行。如果有程序需要运行,它启动他们然后继续休眠,你不需要关系cron的运行机制,只需要知道它在运行,并且不停地轮询cron 任务列表。

 

在上面例子中, crond 的进程号是 387. 进程号为32304 的是grep程序,用来在ps的输出中定位cron的信息

 

The cron 列表文件 随系统的不同可能不同,但通常由下面的东西组成 :

在 /var/spool/cron 或者 /var/spool/cron/crontabs

 

这些文件是利用cron 的用户建立的,每一个文件使用了用户名字信息,你总能发现 一个root 文件 在 /var/spool/cron/root 。如果有一个叫jinx的用户使用了cron 那么一定存在一个 文件/var/spool/cron/jinx

 

ls -l /var/spool/cron 

-rw-------   1  root    root          3768 Jul 14  23:54  root 

-rw-------   1  root    group          207 Jul 15  22:18  jinx 

 

一个cron文件 可能会叫 /etc/crontab ,那是原来cron表文件 原始的名字

 

在目录 /etc/cron.d 中的任何文件

每一个cron 表文件在系统中 有不同的作用,作为一个用户,你可以建立或者编辑 在 /var/spool/cron 中的自己账户文件。

 

cron的另一部分是 表 编辑器, crontab ,它用来编辑 /var/spool/cron 目录中的文件。crontab 自己知道哪的文件需要修改,能让事情变的更简单。

 

crontab 辅助工具有三个选项: -l , -r , -e . 

-l 选项 列出当前 userid 文件中的 任务列表。

-r 选项 删除一个 cron 表文件

-e 编辑 文件

 

cron 表 由以行为单位的 入口项组成, 一个入口由两部分组成 : 执行命令的时间   和  要执行的命令

 

一行 包含 6个 区域, 如果 “#” 开头 ,将被作为注释。 六个域必须 由 空格 或 tabs键分割

 

1. 一小时中哪一分钟执行(0-59) 

2. 一天中哪一小时执行(0-23) 

3. 一月中哪一天     (0-31) 

4. 一年中的哪一年 (1-12) 

5. 每星期的哪一天执行  (0-6) (0=Sunday) 

6. 要执行的命令

 

上面五个 是 什么时间运行, 最后是 要执行的命令

 

一个入口项的前五列 可以由下面的规则组成: 

 

 

一个范围中的一个数字 

一个范围中的 一个时间范围; 例如, 2-10 

一串由 “,”分割的 时间点或范围  例如: 1,2,3-7,8 

一个 “*” 代表所有的 合法的时间 

 

列表或 时间 区间  中间不能有空格, 空格保留为 域的分割符

 

下面是用  crontab -l 命令列出的一个 简单的 cron 表文件:

 

1     $ crontab -l 

2     # DO NOT EDIT THIS FILE 

3     # installed Sat Jul 15 

4     #min    hr   day   mon   weekday  command 

6     30      *     *     *     *       some_command 

7     15,45   1-3   *     *     *       another_command 

8     25      1     *     *     0       sunday_job 

9     45      3     1     *     *       monthly_report 

10    *       15    *     *     *       too_often 

11    0       15    *     *     1-5     better_job 

 

 

第二和第四行 前面有“#” 所以被作为注释.第六行运行 命令 some_command 每小时的30分时运行. 小时,天,月,年,周 都是 “*”  。

第七行运行   another_command 在 每天 凌晨1--3点 的 15, 45分钟运行,  就是, 1:15, 1:45, 2:15, 2:45, 3:15, and 3:45 a.m. 

 

第8行 在 周日的 凌晨 1:25 运行sunday_job

 

第九行 每月第一天的 3:45 运行 月报程序

 

第10行明显是错的 ,用户想 每天凌晨3点运行 任务,但是只是在hour 处输入 3p.m, 仅仅是小时,"*"在 minitue ,从3:00 到 3:59,每分钟都会运行一次。

 

第11行 改正错误, 限制时间是凌晨3点,每周一 ——周五

 

现在你基本了解了cron, 试下下面的实验。cron 通常运行一个脚本,当然可以运行任何命令,如果你没有cron权限,你可以和其他有此权限的人一起工作。

 

用crontab 新建一个cron 表, 我让程序每分钟运行一次

 

$crontab -e 

0-59    *    *    *    *    echo `date` "Hello" >>$HOME/junk.txt 

 

 

第六个域 输出当前时间  (注意 date 由 反引号 包含), 后跟 "Hello",同时 此命令将 结构重定向到 当前HOME目录下junk.txt 文件。

关闭 这个cron 表文件, 如果你拥有cron全限, 你将收到系统提示,文件已成功保存

 

 

用 crontab -l 来查看此文件:

 

 

 

$ crontab -l 

# DO NOT EDIT THIS FILE 

# installed Sat Jul 15 

0-59    *    *    *    *    echo `date` "Hello" >>$HOME/junk.txt 

 

改变你的 home目录, 用touch 命令 创建junk.txt 如果 它不存在, 然后进入home目录, 用tail -f 打开文件,显示其中由 cron插入的内容

$ cd 

$ touch junk.txt 

$ tail -f junk.txt 

Sat Jul 15 15:23:07 PDT Hello 

Sat Jul 15 15:24:07 PDT Hello 

Sat Jul 15 15:25:07 PDT Hello 

Sat Jul 15 15:26:07 PDT Hello 

 

屏幕会刷新,当每分钟 信息插入 junk.txt.

按 Ctrl+D 停止显示

 

确保最后你清理掉,刚才插入cron表的那行  。 用  crontab -e 打开cron 表然后删除刚创建的那行

 

由 cron 运行的所有的命令应该安静,不应该有输出。 因为cron 作为一个隔离的任务,没有终端用来输出。

但是,好的计划,女士,男士, 程序员并没有并没有按照希望的步骤来做, 很有可能一个脚本,一个命令或作业 会输出 一些错误信息

 

为了应付异常,cron 捕捉所有到 stdout或 stderror ,他们并没有被定为到文件的输出,被捕捉到的输出被放到一个邮件中,发送给 写命令的人 或者 root ,另一方面,捕捉错误要比 发出异常 好的多 ,比较方便处理。。

crontab原理

详细解释见 https://www.quora.com/How-does-cron-work     crontab实际上是启动服务后读取所有配置文件,然后睡一段时间(一般也是一分钟)后运行下一个...
  • coder_xia
  • coder_xia
  • 2017年03月09日 08:33
  • 816

详解Linux中cron/crontab工作原理

先介绍几个基本概念:       后台进程:在后台运行的无须与用户交互的程序。在多任务操作系统上运行多个后台进程,有些后台进程(例如守护程序)从来都不需要用户输入,其它一些进程只是在用户忙于目...
  • wzyzzu
  • wzyzzu
  • 2014年12月26日 09:50
  • 1100

Linux的cron和crontab定时任务

一 croncrond位于/etc/rc.d/init.d/crond 或 /etc/init.d 或 /etc/rc.d /rc5.d/S90crond,最总引用/var/lock/subsys/c...
  • 21aspnet
  • 21aspnet
  • 2011年09月27日 15:58
  • 3489

linux cron 工作原理

  • 2009年09月09日 15:55
  • 1KB
  • 下载

二叉树的后序遍历

二叉树的后序遍历   描述 笔记  数据  评测 给出一棵二叉树,返回其节点值的后序遍历。 您在真实的面试中是否遇到过这个题?  Yes 样例 给出一棵二叉树 {1,...
  • chunyang_w
  • chunyang_w
  • 2017年09月03日 21:23
  • 96

Lintcode(M) 二叉树的层次遍历

二叉树的层次遍历描述 笔记 数据 评测 给出一棵二叉树,返回其节点值的层次遍历(逐层从左往右访问)您在真实的面试中是否遇到过这个题? Yes 样例 给一棵二叉树 {3,9,20,#,...
  • Jang1996
  • Jang1996
  • 2016年11月28日 10:49
  • 501

lintcode 二叉树的后序遍历

1:问题描述:给出一棵二叉树,返回其节点值的后序遍历 2:解题思路:用递归的方法后序遍历二叉树,存到vector里去,返回数组,得到二叉树的内容。 3:解题代码:  /**  ...
  • wangyukl
  • wangyukl
  • 2017年04月08日 12:50
  • 816

LintCode -- 二叉树的后序遍历

LintCode -- binary-tree-postorder-traversal(二叉树的后序遍历) 原题链接:http://www.lintcode.com/zh-cn/problem/bi...
  • chan15
  • chan15
  • 2015年09月30日 22:17
  • 981

crontab 详解

cron 是一个可以用来根据时间、日期、月份、星期的组合来调度对重复任务的执行的守护进程。 cron 假定系统持续运行。如果当某任务被调度时系统不在运行,该任务就不会被执行。 要使用 cr...
  • foxman209
  • foxman209
  • 2011年09月08日 13:22
  • 36954

crontab 定时写法整理

目前hadoop hive 及spark脚本需要用定时脚本,任务调度使用的是crontab的任务调度 以下是整理的命令格式: 基本格式 :  *  *  *  *  *  command...
  • bsf5521
  • bsf5521
  • 2017年08月01日 13:35
  • 986
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:crontab的原理及使用
举报原因:
原因补充:

(最多只允许输入30个字)