crontab的原理及使用

#!/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 ,另一方面,捕捉错误要比 发出异常 好的多 ,比较方便处理。。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值