Linux基础--例行工作

1、仅进行一次的工作排程--at 
at的工作情况其实是这样的: 
1)先找寻/etc/at.allow这个档案,写在这个档案中的使用者才能使用at,没有在这个档案中的使用者则不能使用at(即使没有写在at.deny当中); 
2)如果没有/etc/at.allow就寻找/etc/at.deny这个档案,若写在这个at.deny的使用者则不能使用at; 
3)如果两个档案都不存在,那么只有root可以使用at这个指令。

[root@linux ~]# at [-m] TIME 
参数: 
-m:当at的工作完成后,以email的方式通知使用者该工作已完成 
TIME:时间格式,这里可以定义出什么时候要进行at这项工作的时间,格式有: 
HH:MM  ex> 04:00   在今日的HH:MM时刻进行,若该时刻已超过则明天的HH:MM进行此工作 
HH:MM YYYY-MM-DD  ex> 04:00 2005-12-03    强制规定在某年某月的某一天的特殊时刻进行该工作 
HH:MM[am|pm] [Month] [Date]  ex> 04pm December 3    也是一样,强制在某年某月某日的某时刻进行 
HH:MM[am|pm] + number [minutes|hours|days|weeks] ex> now + 5 minutes  ex> 04pm + 3 days   就是说在某个时间点再加几个时间后才进行。 
  
范例一:再过五分钟后,将/root/.bashrc寄给dmtsai这个使用者 
[root@linux ~]# at now + 5 minutes 
at> /bin/mail dmtsai -s "testing at job" < /root/.bashrc 
at> <EOT> <==这里输入 [ctrl] + d 就会出现 <EOF> 的字样!代表结束! 
job 8 at 2005-09-07 10:47

范例二:由于机房预计于2005/09/16停电,我想要在2005/09/15 23:00关机? 
[root@linux ~]# at 23:00 2005-09-15 
at> /bin/sync 
at> /bin/sync 
at> /sbin/shutdown -h now 
at> <EOT> 
job 10 at 2005-09-15 23:00 
    at还可以在一个工作内输入多个指令呢!万一我下达了at之后,才发现指令输入错误该如何是好?就将他移除!利用atq与atrm。 
[root@linux ~]# atq 
[root@linux ~]# atrm [jobnumber] 
范例一:查询目前主机上面有多少的at工作排程? 
[root@linux ~]# atq 
10 2005-09-15 23:00 a root 
   上面说的是在2005/09/15 的 23:00有一项工作,该项工作指令下达者为root,而且,该项工作的工作号码(jobnumber)为10号!

范例二:将上述的第10个工作移除 
[root@linux ~]# atrm 10 
[root@linux ~]# atq 
   没有任何信息,表示该工作被移除了。

 

2、循环执行的例行性命令--crontab 
1)使用者的设定:crontab 
/etc/cron.allow:将可以使用crontab的账号写入其中,若不在这个档案内的使用者则不可使用crontab; 
/etc/cron.deny: 将不可以使用crontab的账号写入其中,若未记录到这个档案当中的使用者,就可以使用crontab。以优先级来说/etc/cron.allow比/etc/cron.deny要优先。 
   当使用者使用crontab这个指令来建立工作排程之后,该项工作就会被纪录到/var/spool/cron/里面去,而且是以账号来作为判别,另外cron执行的每一项工作都会被纪录到/var/log/cron中,所以如果您的Linux不知道有否被植入木马时, 也可以搜寻一下/var/log/cron这个登录档。 
[root@linux ~]# crontab [-u username] [-l|-e|-r] 
参数: 
-u:只有root才能进行这个任务,亦即帮其它使用者建立/移除crontab; 
-e:编辑crontab的工作内容 
-l:查阅crontab的工作内容 
-r:移除crontab的工作内容 
范例一:用dmtsai在每天的12:00发信给自己 
[dmtsai@linux ~]$ crontab -e 
# 此时会进入 vi 的编辑画面让您编辑工作!注意到,每项工作都是一行。 
0 12 * * * mail dmtsai -s "at 12:00" < /home/dmtsai/.bashrc 
#分 时 日 月 周 |<==============指令串========================>|

五个时间参数为: 
代表意义  分钟  小时  日期  月份  周 
数字范围  0-59  0-23  1-31  1-12  0-7 
   当周为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

如何查询使用者目前的crontab内容呢? 我们可以这样来看看: 
[dmtsai@linux ~]$ crontab -l 
59 23 1 5 * mail kiki < /home/dmtsai/lover.txt 
*/5 * * * * /home/dmtsai/test.sh 
30 16 * * 5 mail [email protected] < /home/dmtsai/friend.txt 
   注意,若仅想要移除一项工作而已的话,必须要用crontab -e去编辑,如果想要全部的工作都移除,才使用crontab -r。 
[dmtsai@linux ~]$ crontab -r 
[dmtsai@linux ~]$ crontab -l 
no crontab for dmtsai

 

2)系统的设定:/etc/crontab 
   在Linux下的crontab会自动的帮我们每分钟重新读取一次/etc/crontab的例行工作事项,但是某些原因或者是其它的Unix 系统中,由于crontab是读到内存当中的,所以在你修改完/etc/crontab之后,可能并不会马上执行,这个时候请重新启动crond 这个服务/etc/init.d/crond restart 
[root@linux ~]# cat /etc/crontab 
SHELL=/bin/bash 
PATH=/sbin:/bin:/usr/sbin:/usr/bin 
MAILTO=root 
HOME=/ 
# run-parts 
01 * * * * root run-parts /etc/cron.hourly <==每小时 
02 4 * * * root run-parts /etc/cron.daily <==每天 
22 4 * * 0 root run-parts /etc/cron.weekly <==每周日 
42 4 1 * * root run-parts /etc/cron.monthly <==每个月 1 号 
分 时 日 月 周 执行者身份 指令串

/etc/crontab这个档案里面支持两种下达指令的方式,一种是直接下达指令,一种则是以目录来规划,如: 
a、指令型态 
01 * * * * dmtsai mail -s "testing" kiki < /home/dmtsai/test.txt 
以dmtsai这个使用者的身份,在每小时执行一次mail指令。 
b、目录规划 
*/5 * * * * root run-parts /root/runcron 
建立一个/root/runcron的目录,将要每隔五分钟执行的可执行档都写到该目录下,可以让系统每五分钟执行一次该目录下的所有可执行档。

 

3)资源分配不均的问题 
   如果每个流程都在同一个时间启动的话,那么在某个时段时,系统会变的相当的繁忙, 所以这个时候就必须要分别设定,可以这样做: 
[root@linux ~]# vi /etc/crontab 
1,6,11,16,21,26,31,36,41,46,51,56 * * * * root CMD1 
2,7,12,17,22,27,32,37,42,47,52,57 * * * * root CMD2 
3,8,13,18,23,28,33,38,43,48,53,58 * * * * root CMD3 
4,9,14,19,24,29,34,39,44,49,54,59 * * * * root CMD4

 

4)取消不要的输出项目 
   当有一个排程一直出错(如DNS的侦测系统当中若DNS上层主机挂掉,那么你就会一直收到错误讯息)怎么办?直接以命令重导向将输出的结果输出到/dev/null 这个垃圾桶当中。

 

Linux基础--例行工作,古老的榕树,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。