十六、 
 计划任务  
 
 
 在很多时候为了自动化管理系统,我们都会用到计划任务,比如关机,管理,备份之类的操作,我  
 
 
 们都可以使用计划任务来完成,这样可以是管理员的工作量大大降低,而且可靠度更好。  
 
 
 linux 系统支持一些能够自动执行任务的服务,我们称为计划任务。  
 
 
 LINUX 有如下三种计划任务:  
 
 
 at:指定一个时间执行一个任务 (适用一个或多个任务,执行一次后就不用)  
 
 
 cron:根据一个时间表自动执行任务 (使用一个或多个任务,周期性执行)  
 
 
 系统级别的计划任务及其扩展 anacron:在一个指定时间间隔错过后自动执行任务  
 
 
 1 
 、 
 at:  
 安排一个任务在未来执行,需要一个 
 atd 
 的系统后台进程  
 
 
 检查  
 atd  
 进程是否启动  
 
 
 [root@centos61  
 桌面 
 ]# service atd status  
 
 
 atd (pid 2274)  
 正在运行 
 ...  
 
 
 [root@centos61  
 桌面 
 ]# chkconfig |grep atd  
 
 
 atd  
 
 
 0: 
 关闭  
 1: 
 关闭  
 2: 
 关闭  
 3: 
 启用  
 4: 
 启用  
 5: 
 启用  
 6: 
 关闭  
 
 
 如果未启动,可以使用如下命令:  
 
 
 [root@centos61  
 桌面 
 ]# service atd start  
 
 
 正在启动  
 atd 
 : 
  [ 
 确定 
 ]  
 
 
 [root@centos61  
 桌面 
 ]# chkconfig atd on  
 
 
 常用指令: at:安排延时任务  
 
 
 具体使用方法:  
 
 
 例 1:  
 
 
 #at now+2 minutes 回车  
 
 
 >输入要执行的命令 
 >ctrl+d 结束输入  
 
 
 [root@test ~]# at now+2 minutes  
 
 
 at> wall Aixi  
 
 
 at> <EOT>  
 
 
 job 2 at 2010-06-18 16:36  
 
 
 <EOT>是 ctrl+d 中断输入,这个命令意思是发送一个广播内容是 Hello Aixi.具体时间可以改,单位可以改,可以用 hours,months,years,weeks 等.  
 
 
 例 2 我们还可以跟具体时间  
 
 
 [root@test ~]# at 16:39 dec 10  
 
 
 at> Hello Aixi  
 
 
 at> <EOT> ctrl+d 结束输入  
 
 
 job 3 at 2010-12-10 16:39  
 
 
 意思是在今年的 12 月 10 日 16:39 运行这个命令.如果不加月和日,默认就是今天.  
 
 
 Atq:查询当前的等待任务  
 
 
 用 atq 来查询,已经运行的任务,就消失了。这就是 at 计划任务的重点,只运行一次  
 
 
 atrm:删除等待任务  
 
 
 启动计划任务后,如果不想启动设定好的计划任务可以使用 atrm 命令删除。  
 
 
 格式:atrm 任务号  
 
 
 命令后面跟计划任务编号,如果不跟,就会删除这个用户所有的计划任务。  
 
 
 例 3  
 
 
 atrm 10 //删除计划任务 10  
 
 
 atq //查看计划任务是否删除  
 
 
 at 将要运行的命令以文本形式写入/var/spool/at/目录内,等待 atd 服务的取用和执行。  
 
 
 还可以进入到/var/spool/at 目录里把计划任务删除,计划任务的文件都保存在该目录里,可以用 rm -f  
 
 
 文件名来删除(以文件的形式删除计划任务,因为计划任务是以文件形式保存在该目录中)  
 
 
 例 4:  
 
 
 #cd /var/spool/at //进入到/var/spool/at 目录中  
 
 
 ls //显示目录中所有文件  
 
 
 rm -f a0000b0138b19c //删除计划任务  
 
 
 在通常情况下,超级用户都可以使用这个命令。对于其他用户来说,能否可以使用就取决于两个文  
 
 
 件:/etc/at.allow 和/etc/at.deny。  
 
 
 at 命令是可以基于用户来控制的,我们可以明确指定哪些用户可以使用 at 计划任务,哪些用户不可以使用 at 计划任务。  
 
 
 at 的控制文件  
 
 
 /etc/at.allow  
 
 
 /etc/at.deny  
 
 
 系统默认是有 at.deny 文件,如果某个用户名在这个文件里,他就不能使用 at 计划任务。如果有  
 
 
 at.allow 文件,allow 文件先行,检查了 allow 明确允许,就不会检查 deny。  
 
 
 如果你要让哪个用户不能使用计划任务,就直接把他的用户名写进去就可以了,一排只能写一个。 
 2 
 、 
 cron 
 服务 
 ( 
 参考网址: 
 http://www.linuxsir.org/main/?q=node/209)  
 
 
 相对与 at,cron 的优点就是能够周期性的执行某个命令,at 却只能执行一次,cron 的后台进程名字  
 
 
 是 crond ,cron 也是 system V 的服务,所以我们可以 service crond start|stop 来启动和关闭此服  
 
 
 务,也可以使用 chkconfig 或者 ntsysv 来选择 cron 服务的默认开启,这些命令在以前我们都讲过的  
 
 
 命令:  
 
 
 #crontab -e 编辑当前用户的 cron 表  
 
 
 #crontab -l 查看当前用户的 cron 表  
 
 
 #crontab -r 删除当前用户的 cron 进程  
 
 
 #crontab -u 用户名 以某用户的身份来控制 cron 表  
 
 
 还有个重要的知识点,就是当用户的计划任务建立后是存放在 var/spool/cron 这个目录  
 
 
 当使用 crontab -e 编辑当前用户的 cron 表后,会出现一个 vi 文件,cron 的格式是这样的。分成两  
 
 
 列,左边是时间,右边是运行的命令。时间是由 5 个部分组成。  
 
 
 例:  
 
 
 * * * * * wall hello everyone  
 
 
 5 个星号分别代表:minute hour day-of-month month-of-year day-of-week ,而 wall hello  
 
 
 everyone 这是命令内容。上面的意识是每分每小时每天每月每周广播 hello everyone。具体时间大家可以自己定义。如果要每两分钟发送就用*/2 代替第一个*。也可以是用具体时间来表示。  
 
 
 我们使用 crontab -e 编辑当前用户的 cron 表  
 
 
 这里的 5 个星号就代表的时间和日期:  
 
 
 第一个*星号代表个小时的第几分钟:minute 范围是从 0-59  
 
 
 第二个*星号代表每天的第几个小时:hour 范围是从 0-23  
 
 
 第三个*星号代表每月的第几个日:day-of-month 范围从 1-31  
 
 
 第四个*星号代表没年的第几个月:month-of-year 范围从 1-12  
 
 
 第五个*星号代表每周的星期几:day-of-week 范围从 0-6,其中 0 表示星期日  
 
 
 用户名:也就是执行程序要通过哪个用户来执行,这个一般可以省略;  
 
 
 命令:执行的命令和参数。  
 
 
 时程表的格式如下 :  
 
 
 f1 f2 f3 f4 f5 program  
 
 
 其中 f1 是表示分钟,f2 表示小时,f3 表示一个月份中的第几日,f4 表示月份,f5 表示一个星期  
 
 
 中的第几天。program 表 示要执行的程序。  
 
 
 当 f1 为 * 时表示每分钟都要执行 program,f2 为 * 时表示每小时都要执行程序,其余以此类推  
 
 
 当 f1 为 a-b 时表示从第 a 分钟到第 b 分钟这段时间内要执行,f2 为 a-b 时表示从第 a 到第 b小时都要执行,其余以此类推  
 
 
 当 f1 为 */n 时表示每 n 分钟个时间间隔执行一次,f2 为 */n 表示每 n 小时个时间间隔执行一次,其余以此类推  
 
 
 当 f1 为 a, b, c,... 时表示第 a, b, c,... 分钟要执行,f2 为 a, b, c,... 时表示第 a, b, c... 个小时要执行,其余以此类推  
 
 
 使用者也可以将所有的设定先存放在档案 file 中,用 crontab file 的方式来设定时程表。  
 
 
 例 1:如果我要表示 9 月 10 日 25 分执行 ls var/spool/cron 任务怎么表示?  
 
 
 25 * 10 9 * ls var/spool/cron  
 
 
 由于我没表示小时,所以就只能里面为每小时  
 
 
 例 2:我要在每周日,每分钟执行 wall Hello redking.blog.51cto.com 这个命令,时间怎么表示?  
 
 
 */1 * * * 0 wall Hello redking.blog.51cto.com  
 
 
 */ 表示每多少分钟执行一次  
 例 3:每晚的 21:30 重启 apache。  
 
 
 30 21 * * * /usr/local/etc/rc.d/lighttpd restart  
 
 
 例 4:每月 1、10、22 日的 4 : 45 重启 apache  
 
 
 45 4 1,10,22 * * /usr/local/etc/rc.d/lighttpd restart  
 
 
 例 5:每周六、周日的 1 : 10 重启 apache  
 
 
 10 1 * * 6,0 /usr/local/etc/rc.d/lighttpd restart  
 
 
 例 6:在每天 18 : 00 至 23 : 00 之间每隔 30 分钟重启 apache  
 
 
 0,30 18-23 * * * /usr/local/etc/rc.d/lighttpd restart  
 
 
 例 7:每一小时重启 apache  
 
 
 * */1 * * * /usr/local/etc/rc.d/lighttpd restart  
 
 
 例 8:晚上 11 点到早上 7 点之间,每隔一小时重启 apache  
 
 
 * 23-7/1 * * * /usr/local/etc/rc.d/lighttpd restart  
 
 
 例 9:每月的 4 号与每周一到周三的 11 点重启 apache  
 
 
 0 11 4 * mon-wed /usr/local/etc/rc.d/lighttpd restart  
 
 
 例 10:一月一号的 4 点重启 apache  
 
 
 0 4 1 jan * /usr/local/etc/rc.d/lighttpd restart  
 
 
 例 11:在 12 月内, 每天的早上 6 点到 12 点中,每隔 3 个小时执行一次 /usr/bin/backup  
 
 
 0 6-12/3 * 12 * /usr/bin/backup  
 
 
 例 12:每月每天的午夜 0 点 20 分, 2 点 20 分, 4 点 20 分....执行 echo "haha"  
 
 
 20 0-23/2 * * * echo "haha"  
 
 
 3 
 、系统级别的计划任务及其扩展 
 anacrontab  
 
 
 这个是系统设置好了,清理系统垃圾或者是自动执行某些脚本的系统任务,一般我们做了解就行了, 不要更改配置文件是/etc/conrtab  
 
 
 
 
 SHELL:就是运行计划任务的解释器,默认是 bash  
 
 
 PATH:执行命令的环境变量  
 
 
 MAILTO:计划任务的出发者用户  
 
 
 HOME:家目录为/  
 
 
 run-parts 是一个脚本,在/usr/bin/run-parts,作用是执行一个目录下的所有脚本/程序。  
 
 
 run-parts /etc/cron.hourly 执行目录/etc/cron.hourly/之下的所有脚本/程序.  
 
 
 run-parts 下面就是运行的命令  
 
 
 vim /etc/crontab 与 crontab -e 写入的定时运行的区别?  
 
 
 vim /etc/crontab:是系统级别定义的 crontab,/etc/crontab 的所有者和组都是 root  
 
 
 crontab -e :是用户自定义的 crontab,是所有的用户都可以写入的  
 两种方法记录的位置不一样,一个在/etc/ 另一个在/var/ 里面。都被 cron 服务调用  
 
 
 如果系统在以上说的时间没有开机怎么办?那么这个脚本不就是不能执行了?设计者早就想到了这个问题,所以就有了 cron 服务的扩展,目的就是为了防止非 24 小时开机的计算机遗漏的守护任务,anacr  
 
 
 ontab 就是系统计划任务的扩展文件:在一个指定时间间隔错过后自动执行任务  
 
 
 格式是这样的:  
 
 
 period delay job-identifier command  
 
 
 period — 命令执行的频率(天数)  
 
 
 delay — 延迟时间(分钟)  
 
 
 job-identifier — 任务的描述,用在 anacron 的消息中,并作为作业时间戳文件的名称,只能包括  
 
 
 非空白的字符(除斜线外)。  
 
 
 command — 要执行的命令  
 
 
 
 
 第一行的意思是:每天开机 65 分钟后就检查 cron.daily 文件是否被执行了,如果今天没有被执行就执行他  
 
 
 第二行的意思是:每隔 7 天开机后 70 分钟检查 cron.weekly 文件是否被执行了,如果一周内没有被执行就执行他  
 
 
 第三行的意思也差不多  
 
 
 下面说说关于 cron 服务的控制,和 at 差不多,就是/etc/cron.deny 这个配置文件来控制,里面写入要禁止使用 cron 用户的名字,一行一个就 OK 了 
                


















