分类: LINUX
2011-03-31 20:42:17
最近更新日期:2002/05/30
?
?
: at
: crontab
: /etc/crontab
: /var/log/cron 记录文件
什么是例行性命令?
每个人或多或少都有一些约会或者是工作,有的工作是例行性的,例如每年一次的加薪、每个月一次的工作报告、每周一次的午餐会报、每天需要的打卡等等;有的工作则是临时发生的,例如刚好总公司有高官来访,需要你准备演讲器材等等!用在生活上面,例如每年的爱人的生日、每天的起床时间等等、还有突发性的计算机大降价(阿~我等好久了~~)等等啰。这些工作都可以称为例行性命令,而这些工作 Linux 也都可以帮您提醒,例如:每一天早上 8:00 钟要服务器连接上音响,并启动音乐来唤你起床;而中午 12:00 希望 Linux 可以发一封信到你的邮件信箱,提醒你可以去吃午餐了;另外,在每年的你爱人的生日的前一天,先发封信提醒你,以免忘记这么重要的一天。
从上面的说明当中可以很清楚的发现两种工作排程的方式:
那么在 Linux 底下如何达到这两个功能呢?呵呵!那就得使用 at 与 crontab 这两个好东西啰!
底下我们先来谈一谈 Linux 的系统到底在做什么事情,怎么有若干多的工作排程在工作呢?然后再回来谈一谈 at 与 crontab 这两个好东西!
Linux 系统的例行性命令有哪些
好了,那么服务器自己有什么例行性命令要来作呀!?Linux 的工作可多着呢!由前面提到的几篇文章中,我们知道Linux 本身在背景下的工作可是很多的,尤其是网络开放的情况下,建立与取消联机、MySQL 数据库的实时更新、以及一些例行的系统指令,例如释放内存的工作等等。由于例行的工作非常的多,实在不可能每天都要管理员来手动输入吧!所以才会建立这个工作排程的需求的!基本预设的工作有底下这些:
Linux 预设的例行工作至少就有这些了,再加上您努力的为 Linux 进行工作排程的设计,嘿嘿!每天的工作量可是相当的大的呢!
仅执行一次的工作排程
如果仅要执行一次的工作,就使用 at 这个指令吧!这个指令其实就是 atd 这个服务啦!所以请记得一定要启动这个服务呦!如果是在 Red Hat 系统下,可以使用:
1. ntsysv
2. 选择 atd
3. 按下 OK !
如果是在 Mandrake 系统下,可以使用:
1. chkconfig --add atd
2. chkconfig --list
上面这个指令可以查看 atd 在 run-level 正确的情况中,是否会在开机的时候被启动!
基本上, atd 是预设开启的,如果您没有更动过系统默认值的话,那么上面的动作就不需要动啰!下达 at 这个动作会将工作排程写入 /var/spool/at 这个目录下呢!然后等待系统将之执行啰!此外,这个 at 指令虽然预设是所有人都能进行,但是可以经由 root 的规范来限制使用的人口。限制的方法其实与 /etc/hosts.allow(deny) 类似,使用 /etc/at.allow(deny) 这两个档案来限制:
1. 先找寻 /etc/at.allow 这个档案,写在这个档案中的使用者才能使用 at ,没有在这个档案中的使用者则不能使用 at ( 即使没有写在 at.deny 当中 );
2. 如果没有 /etc/at.allow 就寻找 /etc/at.deny 这个档案,若写在这个 at.deny 的使用者则不能使用 at ,而没有在这个 at.deny 档案中的使用者,就可以使用 at 咯;
3. 如果两个档案都不存在,那么只有 root 可以使用 at 这个指令。
好了!我们来谈一谈 at 的语法吧!
[test @test test]# at [-m] TIME (下达工作指令) [test @test test]# at 5pm <==在今天的 5pm 执行,如果今天已过 5 点则明天执行; [test @test test]# atq <==窥视一下你(test)目前有多少工作? [test @test test]# atrm 5<==删除第 5 号工作 |
请注意!在 at 下达之后,便进入指令列下达的模式!在这里你可以重复的输入指令,但是离开的时候请下达『 [Ctrl] + D 』就可以离开了!离开之后,系统会告诉你这个工作排程的号码与使用者是谁!呵呵!很简单吧!
循环执行的例行性命令
这个循环的例行性命令其实就是 cron 这个服务啦 (crond)!当你下达 crontab 的指令之后,会将你的命令写入 /var/spool/cron这个目录当中呦!例如 test 下达了他的 crontab 命令,那么就会自动产生 /var/spool/cron/test 这个档案!『但请注意,这个档案不能直接编辑!』然后执行的指令记录会放置在 /var/log/cron 这个档案中!所以,『如果您的 Linux 系统不知道是否被木马入侵时,可以搜寻一下 /var/log/cron 这个记录挡,视察看看有没有被搞鬼?』
好了!我们来看一下 crontab 的指令语法吧!
[test @test test]# crontab [-u user] [-l | -e | -r] [test @test test]# crontab -e <==自己编辑自己的 crontab 内容 进入 crontab 编辑内容,使用 vi 呦! 0 12 * * * mail test < /home/test/test.txt |
上面的例子是说:假如你需要在每天的正午 12:00 发一封信给你自己,而且信的内容已经写好了,那要怎样作呢?而且,另一个假设是,你在 Linux Server 中的权限仅止于一般使用者,并不是 root (管理员)身份,那要怎样设定你的例行性命令呢?哈哈!那就使用 crontab 这个指令吧!你只要执行『 crontab -e 』就可以进入 vi 的编辑画面来编辑你的例行性命令说!
在上面的例子中,输入 crontab -e 时,会出现一个 画面,然后你在 vi 画面中输入上面的一行字,之后按 :wq 储存后离开!即可完成编辑!容易吧!那上面那一行字代表什么意义呢?你可以看到,在真正执行命令之前(就是 mail test < /home/test/test.txt )总共有五个数字,这五个数字分别代表:
分 (0-59)
小时 (0-23)
日期 (1-31)
月份 (1-12)
周 (0-6)
数字代表的意义 |
分钟 |
小时 |
日期 |
月份 |
周 |
范围 |
0-59 |
0-23 |
1-31 |
1-12 |
0-6 (0为星期天) |
另外,如果是『 * 』的时候,代表所有数字都适用的意思。所以,你就可以知道我上面那一行写的意义为何了!那就是『不论何月、何日、星期几的 12 点 0 分时,执行 mail test < /home/test/test.txt 这个命令』!还不了解?没关系,我们这里作几个例子!
例题一:假如你的女朋友生日是 5 月 2 日,你想要在 5 月 1 日的 23:59 发一封信给他, [test @test test]# crontab -e 59 23 1 5 * mail pigpp < /home/test/lover.txt |
那样的话,每年 pigpp 都会收到你的这封信喔!(当然啰,信的内容就要每年变一变啦!)
例题二:假如你每隔五分钟要去 check 你的一个名为 test.sh 的批次档一次,则: [test @test test]# crontab -e 59 23 1 5 * mail pigpp < /home/test/lover.txt <==刚刚的那个指令还存在呦! |
注意到呦!那个 crontab 每个人都只有一个档案,就是在 /var/spool/cron 里面的档案啦!还有两件事要注意一下:
(1) 指令的路径最好是下达,这样比较不会找不到执行的档案喔;
(2) 第一个数字 */5 表示『每五分钟执行一次』的意思!
例题三:假如你每个礼拜的星期五下午 4:30 要告诉朋友星期六的约会不要忘记,则: [test @test test]# crontab -e 59 23 1 5 * mail pigpp < /home/test/lover.txt |
呵呵!这样很简单吧!如此就可以轻易的达到您所需要的例行性工作排程的安排啰!
好了!那么我们要如何来查看使用者目前的 crontab 的工作排程呢?
[test @test test]# crontab -l <==这个 -l 是 L 的小写 |
呵呵呵!其实这个显示的内容就是 /var/spool/cron/test 档案的内容啦!那么如何删除排程呢?
[test @test test]# crontab -r |
看到了吗? crontab 『整个内容都不见了!』所以请注意:『如果只是要删除某个 crontab 的工作项目,那么请使用 crontab -e 来重新编辑即可!』如果使用 -r 的参数,是会将所有的 crontab 数据内容都删掉的!千万注意了!
系统的 crontab 设定
这个『 crontab -e 』是针对使用者的 cron 来设计的,如果是『系统的例行性任务』时,该怎么办呢?是否还是需要以 crontab -e 来管理你的例行性命令呢?当然不需要,你只要编辑 /etc/crontab这个档案就可以啦!有一点需要特别注意喔!那就是 crontab -e 这个 crontab 其实是 /usr/bin/crontab 这个执行档,但是 /etc/crontab 可是一个『纯文字文件』喔!你可以 root 的身份编辑一下这个档案哩!
基本上, cron 这个服务的最低侦测限制是『分钟』,所以『 cron 会每分钟去读取一次 /etc/crontab 与 /var/spool/cron 里面的数据内容』,因此,只要你编辑完 /etc/crontab 这个档案,并且将他储存之后,呵呵!那么 crontab 的设定就自动的会来执行了!
注意:在 Linux 底下的 crontab 会自动的帮我们每分钟重新读取一次 /etc/crontab 的例行工作事项,但是某些原因或者是其它的 Unix 系统中,由于 crontab 是读到内存当中的,所以在你修改完 /etc/crontab 之后,可能并不会马上执行,这个时候请重新启动 crond 这个服务吧!
/etc/rc.d/init.d/crond restart
好了,我们来看看 /etc/crontab 这的档案的内容吧:
[root@test /root]# vi /etc/crontab # run-parts |
看到这个档案的内容你大概就了解了吧!呵呵,没错!这个档案与将刚刚我们下达 crontab -e 的内容几乎完全一模一样!只是有几个地方不太相同:
注意:基本上 /etc/crontab 里头支持两种下达指令的方式,一种是直接以指令型态 下达,一种则是以『目录规划』来下达;
这样就可以晓得 run-parts 的用意了吧!此外,与 crontab -e 规划当中最不相同的就是多了一个『使用者层级』的概念,通常我们都是以 root 的角度来规划例行性命令,但是总有不需要 root 的指令吧!就可以使用这个层级来规范该程序的使用者属于谁啰!
好!你现在大概了解了这一个咚咚吧!OK!假设你现在要作一个目录,让系统可以每 2 分钟去执行这个目录下的所有可以执行的档案,你可以写下如下的这一行在 /etc/crontab 中:
*/2 * * * * root run-parts /etc/cron.min
当然啰, /etc/cron.min 这个目录是需要存在的喔!那如果我需要执行的是一个『程序』而已,不需要用到一个目录呢?该如何是好?例如在侦测网络流量时,我们希望每五分钟侦测分析一次,可以这样写:
*/5 * * * * root /usr/local/mrtg-2/bin/mrtg /usr/local/apache/htdocs/mrtg/net/mrtg.cfg
没有了 run-parts 就是代表『一个档案』的意思啦!
如何!?建立例行性命令很简单吧!如果你是系统管理员的话,直接修改 /etc/crontab 这个档案即可喔!又便利,又方便管理呢!
安全的防护
如果每个流程都在同一个时间启动的话,呵呵!那么在某个时段时,我的系统会变的相当的繁忙,所以,这个时候就必须要分别设定啦!我可以这样做:
[root@test /root]# vi /etc/crontab |
看到了没?那个『 , 』分隔的时候,请注意,不要有空格符!(连续的意思)如此一来,则可以将每五分钟工作的流程分别在不同的时刻来工作!则可以让系统的执行较为顺畅呦!