好记性不如烂笔头,日志中记录了本人学习时遇到的知识点,方便自己回顾所学,也给有需要的童孩提供参考。欢迎大家阅读,并提出宝贵意见。

Linux: 例行性工作排程

上一篇 / 下一篇  2013-06-26 15:30:52 / 个人分类:Linux

1.    Linux 工作排程的种类: at, cron
    at :是个可以处理仅执行一次就结束排程的指令,不过要执行 at 时, 必须要有 atd 这个服务 的支援才行。重启atd命令:/etc/init.d/atd restart
    crontab :这个指令所设定的工作将会循环的一直进行下去! 可循环的时间为分钟、小时、每周、每月或每年等。crontab 除了可以使用指令执行外,亦可编辑 /etc/crontab 来支持。 至于让 crontab 可以生效的服务则是 crond 这个服务喔!

2.    at 的使用限制
    先找寻 /etc/at.allow 这个档案,写在这个档案中的使用者才能使用 at ,没有在这个档案中的使用者则不能使用 at (即使没有写在 at.deny 当中);
    如果 /etc/at.allow 不存在,就寻找 /etc/at.deny 这个档案,若写在这个 at.deny 的使用者则不能使用 at ,而没有在这个 at.deny 档案中的使用者,就可以使用 at 咯;
    如果两个档案都不存在,那么只有 root 可以使用 at 这个指令。

3.    at命令详解
[root@www ~]# at [-mldv] TIME
[root@www ~]# at -c 工作号码
选项与参数:
-m  :当 at 的工作完成后,即使没有输出讯息,亦以 email 通知使用者该工作已完成。
-l  :at -l 相当于 atq,列出目前系统上面的所有该用户的 at 排程;
-d  :at -d 相当于 atrm ,可以取消一个在 at 排程中的工作;
-v  :可以使用较明显的时间格式栏出 at 排程中的任务栏表;
-c  :可以列出后面接的该项工作的实际指令内容。
 
TIME:时间格式,这里可以定义出『什么时候要进行 at 这项工作』的时间,格式有:
  HH:MM        ex> 04:00
  在今日的 HH:MM 时刻进行,若该时刻已超过,则明天的 HH:MM 进行此工作。
  HH:MM YYYY-MM-DD  ex> 04:00 2009-03-17
  强制规定在某年某月的某一天的特殊时刻进行该工作!
  HH:MM[am|pm] [Month] [Date]  ex> 04pm March 17
  也是一样,强制在某年某月某日的某时刻进行!
  HH:MM[am|pm] + number [minutes|hours|days|weeks]
  ex> now + 5 minutes  ex> 04pm + 3 days
  就是说,在某个时间点『再加几个时间后』才进行。

范例一:再过五分钟后,重启系统
[root@www ~]# at now + 5 minutes  <==记得单位要加 s 喔!
at> reboot
at> <EOT>   <==这里输入 [ctrl] + d 就会出现 <EOF> r 字样!代表结束!
job 4 at 2013-03-14 15:38

范例三:由于机房预计于 2009/03/18 停电,我想要在 2009/03/17 23:00 关机?
[root@www ~]# at 23:00 2009-03-17
at> /bin/sync
at> /bin/sync
at> /sbin/shutdown -h now
at> <EOT>
job 5 at 2009-03-17 23:00
# 您瞧瞧! at 还可以在一个工作内输入多个指令呢!不错吧!

    事实上,当我们使用 at 时会进入一个 at shell 的环境来让用户下达工作指令,此时,建议你最好使用绝对路径来下达你的指令,比较不会有问题喔!由于指令的下达与 PATH 变量有关, 同时与当时的工作目录也有关连 (如果有牵涉到档案的话),因此使用绝对路径来下达指令,会是比较一劳永逸的方法。为什么呢?举例来说,你在 /tmp 下达『 at now 』然后输入『 mail root -s "test" < .bashrc 』, 问一下,那个 .bashrc 的档案会是在哪里?答案是『 /tmp/.bashrc 』!因为 at 在运作时,会跑到当时下达 at 指令的癿那个工作目录的缘故啊!

4.    atq 与 atrm:查看和删除指令
[root@www ~]# atq
[root@www ~]# atrm [jobnumber]
 
范例一:查询目前主机上面有多少癿 at 工作排程?
[root@www ~]# atq
5       2009-03-17 23:00 a root
# 上面说癿是:『在 2009/03/17 的 23:00 有一项工作,该项工作指令下达者为root』而且,该项工作的工作号码 (jobnumber) 为 5 号喔!
 
范例二:将上述的第 5 个工作移除!
[root@www ~]# atrm 5
[root@www ~]# atq
# 没有仸何信息,表示该工作被移除了!

5.    Crontab的使用限制
    /etc/cron.allow: 将可以使用 crontab 的账号写入其中,若不在这个档案内的使用者则不可使用 crontab;
    /etc/cron.deny: 将不可以使用 crontab 的账号写入其中,若未记录到这个档案当中的使用者,就可以使用 crontab 。
与 at 很像吧!同样的,以优先级来说, /etc/cron.allow 比 /etc/cron.deny 要优先, 而判断上面,这两个档案只选择一个来限制而已,因此,建议你只要保留一个即可, 免得影响自己在预定上面的判断!一般来说,系统默认是保留 /etc/cron.deny , 你可以将不想让他执行 crontab 的那个使用者写入 /etc/cron.deny 当中,一个账号一行!

6.    Crontab的语法
[root@www ~]# crontab [-u username] [-l|-e|-r]
选项与参数:
-u  :只有 root 才能进行这个任务,亦即帮其他使用者建立/移除 crontab 工作排程;
-e  :编辑 crontab 的工作内容
-l  :查阅 crontab 的工作内容
-r  :移除所有的 crontab 的工作内容,若仅要移除一项,请用 -e 去编辑。
 
范例一:用 dmtsai 的身份在每天的 12:00 发信给自己
[dmtsai@www ~]$ crontab -e
# 此时会进入 vi 的编辑画面让您编辑工作!注意到,每项工作都是一行。
0   12  *  *  * mail dmtsai -s "at 12:00" < /home/dmtsai/.bashrc
#分 时 日 月 周 |<==============指令串========================>|

编辑完毕之后输入『 :wq 』储存后离开 vi 就可以了! 而每项工作 (每行) 的格式都是具有六个字段,这六个字段的意义为:
代表意义    分钟    小时    日期    月份    周    指令
数字范围    0-59    0-23    1-31    1-12    0-7    呀就指令啊

一些辅助的字符,大概有底下这些:
特殊字符    代表意义
*(星号)    代表任何时刻都接受的意思!举例来说,范例一内那个日、月、周都是 * , 就代表着『不论何月、何日癿礼拜几的 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 都适用的意思!
/n(斜线)    那个 n 代表数字,亦即是『每隔 n 单位间隔』的意思,例如每五分钟进行一次,则: */5 * * * * command 很简单吧!用 * 与 /5 来搭配,也可以写成 0-59/5 ,相同意思!

范例:
假如每五分钟需要执行 /home/dmtsai/test.sh 一次,又该如何? 
答: 同样使用 crontab -e 进入编辑:
*/5 * * * * /home/dmtsai/test.sh

那个 crontab 每个人都只有一个档案存在,就是在 /var/spool/cron 里面啊! 还有建议您:『指令下达时,最好使用绝对路径,这样比较不会找不到执行档喔!』


TAG:

 

评分:0

我来说两句

Open Toolbar