http://www.lampbrother.net
[Linux]Linux Unix计划任务at cron
计划任务之at
使用它在一个特定的时间运行一次特殊的作业。 系统上常见的例行性命令举例:
1. 进行登录文件的数据轮替 (log rotate) 2.rpm 数据库的建立 {不解,来源资料2} 3.建立 locate 的数据库 {不解,来源资料2} 4.进行程序的分析 5.登录文件分析
6.指纹数据库的比对 即tripwire套件
at 其实是一个脚本: /etc/init.d/atd. 工作纪录文件预设的放置目录在 /var/spool/at 底下, 默认所有用户都可以执行at, /etc/at.allow 与 /etc/at.deny可以设置权限. 先找寻 /etc/at.allow 这个档案,写在这个档案中的使用者才能使用 at ,没有在这个档案中的使用者则不能使用 at ( 即使没有写在 at.deny 当中 );
如果没有 /etc/at.allow 就寻找 /etc/at.deny 这个档案,若写在这个 at.deny 的使用者则不能使用 at ,而没有在这个 at.deny 档案中的使用者,就可以使用 at 咯; 如果两个档案都不存在,那么只有 root 可以使用 at 这个指令。 at命令的基本形式为:
at [-f script] [-m -l -r] [time] [date] 其中,
-f script 是所要提交的脚本或命令。
-l 列出当前所有等待运行的作业。atq命令具有相同的作用。
-r 清除作业。为了清除某个作业,还要提供相应的作业标识(ID);有些U N I X变体只接受atrm作为清除命令。 -m 作业完成后给用户发邮件。
time at命令的时间格式非常灵活;可以是HH:MM , HH:MM YYYY-MM-DD, HH:MM[am|pm] [Month] [Date] 比如04pm December 3, MM[am|pm] + number [minutes|hours|days|weeks] 比如now + 5 minutes和 04pm + 3 days
date 日期格式可以是月份数或日期数,而且at命令还能够识别诸如today、tomorrow这样的词。
可以使用echo命令向at命令提交作业:
$ echo find /etc -name \
http://www.lampbrother.net
可以使用at -l命令来列出所有的作业 清除作业的命令格式为: atrm [job no]或 at -r [job no] 实例: 在16:22删除LTS模块的log [root@svr-86-21 log]# at 16:22 at> rm -rf /var/log/lts.log*-* at>
job 1 at 2007-11-28 16:22
可以在/var/spool/at 看到a0000101303816这个文件. 结束符是Ctrl+D
计划任务之cron
cron 系统调度进程。可以使用它在每天的非高峰负荷时间段运行作业,或在一周或一月中的不同时段运行. 这个工作将持续例行性的作下去!它查找/var/spool/cron下的文件,与/etc/passwd中的用户对照,还查找/etc/crontab,/etc/cron.d/中的文件。每分钟执行一次。格式参考:crontab(5)
安全设置: /etc/cron.allow /etc/cron.deny, 内容记录在/var/spool/cron/,log在/var/log/cron 语法
crontab [-u username] [-l|-e|-r] 参数:
-u :只有 root 才能进行这个任务,亦即帮其它使用者建立/移除 crontab; -e :编辑 crontab 的工作内容 -l :查阅 crontab 的工作内容 -r :移除 crontab 的工作内容
范例一:用 dmtsai 在每天的 12:00 发信给自己 [dmtsai@linux ~]$ crontab -e
0 12 * * * mail dmtsai -s \五个时间参数代表什么呢? 代表意义 分钟
http://www.lampbrother.net
小时 日期 月份 周
数字范围 0-59 0-23 1-31 1-12 0-6
还有一些辅助的字符,大概有底下这些: 特殊字符 代表意义 *
代表任何时刻都接受的意思!举例来说,上表的范例一,那个日、月、周都是 * , 就代表着『不论何月、何日的礼拜几的 12:00 都执行后续指令』的意思! ,
代表分隔时段的意思。举例来说,如果要下达的工作是 3:00 与 6:00 时,就会是: 0 3,6 * * * command
还是有五栏,不过第二栏是 3,6 ,代表 3 与 6 都适用! -
代表一段时间范围内,举例来说, 8 点到 12 点之间的每小时的 20 分都进行一项工作: 20 8-12 * * * command
仔细看到第二栏变成 8-12 喔!代表 8,9,10,11,12 都适用的意思!
http://www.lampbrother.net
/n
那个 n 代表数字,亦即是『每隔 n 单位间隔』的意思,例如每五分钟进行一次,则: */5 * * * * command
很简单吧!用 * 与 /5 来搭配,也可以写成 0-59/5 ,相同意思!
每五分钟需要执行 /home/dmtsai/test.sh 一次,又该如何? 答:
同样使用 crontab -e 进入编辑: */5 * * * * /home/dmtsai/test.sh 系统的设定: /etc/crontab
基本上, cron 这个服务的最低侦测限制是『分钟』,所以『 cron 会每分钟去读取一次 /etc/crontab 与 /var/spool/cron 里面的数据内容 』,因此,只要你编辑完 /etc/crontab 这个档案,并且将他储存之后,呵呵!那么 cron 的设定就自动的会来执行了! Tips:
在 Linux 底下的 crontab 会自动的帮我们每分钟重新读取一次 /etc/crontab 的例行工作事项,但是某些原因或者是其它的 Unix 系统中,由于 crontab 是读到内存当中的,所以在你修改完 /etc/crontab 之后,可能并不会马上执行, 这个时候请重新启动 crond 这个服务吧!
/etc/init.d/crond restart
好了,我们就来看一下这个 /etc/crontab 的内容吧! [root@linux ~]# cat /etc/crontab SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root HOME=/ # run-parts
0 1 * * * * root run-parts /etc/cron.hourly <==每小时 02 4 * * * root run-parts /etc/cron.daily <==每天 22 4 * * 0 root run-parts /etc/cron.weekly <==每周日
http://www.lampbrother.net
42 4 1 * * root run-parts /etc/cron.monthly <==每个月 1 号 分 时 日 月 周 执行者身份 指令串
看到这个档案的内容你大概就了解了吧!呵呵,没错!这个档案与将刚刚我们下达 crontab -e 的内容几乎完全一模一样!只是有几个地方不太相同: MAILTO=root:
这个项目是说,当 /etc/crontab 这个档案中的例行性命令发生错误时,或者是该执行结果有 STDOUT/STDERR 时, 会将错误讯息或者是屏幕显示的讯息传给谁?预设当然是由系统直接寄发一封 mail 给 root 啦!不过, 由于 root 并无法在客户端中以 POP3 之类的软件收信,因此,我通常都将这个 e-mail 改成自己的账号,好让我随时了解系统的状况!例如: mailto=dmtsai@my.host.name PATH=....:
还记得我们在 BASH Shell 当中一直提到的执行文件路径问题吧!没错啦!这里就是输入执行文件的搜寻路径! 使用预设的路径设定就已经很足够了! 01 * * * * root run-parts /etc/cron.hourly:
在批注符号『 #run-parts 』这一行以后的命令,我们可以发现,五个数字后面接的是 root 喔!没错,与 crontab -e 的内容是不太一样的!这个字段的 root 代表的是『 执行的使用者身份为 root 』当然啰,你 也可以将这一行改写成其它的身份哩!而 run-parts 代表后面接的 /etc/cron.hourly 是『 一个目录内(/etc/cron.hourly)的所有可执行档 』,这也就是说,每个小时的 01 分,系统会以 root 的身份去 /etc/cron.hourly/ 这个目录下执行所有可以执行的档案!后面的三行也都是类似的意思!你可以到 /etc/ 底下去看看,系统本来就预设了这四个目录了!你可以将每天需要执行的命令直接写到 /etc/cron.daily/ 即可,还不需要使用到 crontab -e 的程序呢!方便吧!
基本上, /etc/crontab 这个档案里面支持两种下达指令的方式,一种是直接下达指令, 一种则是以目录来规划,例如: 指令型态
01 * * * * dmtsai mail -s \以 dmtsai 这个使用者的身份,在每小时执行一次 mail 指令。 目录规划
*/5 * * * * root run-parts /root/runcron
建立一个 /root/runcron 的目录,将要每隔五分钟执行的『可执行档』都写到该目录下, 就可以让系统每五分钟执行一次该目录下的所有可执行档。
这样就可以晓得 run-parts 的用意了吧!此外,与 crontab -e 规划当中最不相同的就是多了一个『使用者层级』的概念,通常我们都是以 root 的角度来规划例行性命令,但是总有不需要 root 的指令吧!就可以使用这个层级来规范该程序的使用者属于谁啰!