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