系统经常会主动执行一些任务,这些任务可能又分为“单一”工作与“循环”工作。
1、什么是例行性工作
有的工作是例行性的,有的工作是临时发生的。
如果计算机系统能够主动通知我某些事情的话,那不就轻松很多!
1.1、Linux工作调度的种类:at,cron
两种工作调度的方式:
一种是例行性的,就是每隔一定的周期要来办的事项;
一种是突发性的,就是这次做完以后就没有的那一种。
at:at是个可以处理仅执行一次就结束调度的命令,不过要执行at时,必须要有atd这个服务的支持才行;
crontab:crontab这个命令所设置的工作将会循环一直执行下去。可循环的时间为分钟、小时、每周、每月或每年等。crontab处理可以使用命令执行外,也可编辑/etc/crontab来支持。至于让crontab可以生效的服务则是crond这个服务。
1.2、Linux上常见的例行性工作
基本上Linux系统常见的例行性任务有:
进行日志文件的轮替(log rotate);
日志文件分析logwatch的任务;
新建locate的数据库;
whatis数据库的建立;
RPM软件日志文件的新建;
删除临时文件;
与网络服务有关的分析行为;
2、仅执行一次的工作调度
单一工作调度的运作,at这个命令。
2.1、atd的启动与at运行方式
atd这个服务调度at
service atd start
at的运行方式:
事实上,我们使用at这个命令来生成所要运行的工作,并将这个工作以文本的方式写入/var/spool/at目录内,该工作便能等待atd这个服务的取用并执行了。
不过,并不是所有的人都可以进行at工作调度。所以,除非是你认可的账户,否则先不要让他们使用at。
我们可以利用/etc/at.allow和/etc/at.deny这两个文件来进行at的使用限制。
2.2、实际运行单一工作调度
at这个命令最重要的地方在于时间的指定, now + x minutes也是不错的方法。
事实上,当我们使用at时会进入一个at shell的环境来让用户执行工作命令,此时,建议你最好使用绝对路径来执行你的命令。
at 的执行与终端机环境无关,而所有的standard output/standard error output都会传送到执行者的mailbox里面去,不是输出在屏幕上。
还要注意的是,at执行过后并没有任何输出信息,如果你想要知道命令执行没有,可以发送一封邮件告知你。
at还有一个很棒的优点,那就是“后台执行”的功能!
脱机继续工作的任务,由于在 at 工作调度的使用上,系统会将该项at工作独立出你的bash环境中,直接交给系统的atd程序来接管,因此,当你执行了at的工作之后就可以立刻脱机了,剩下的工作就完全交给Linux管理即可。
at的工作管理:
利用atp来查询,利用atrm来删除。
如果你是在一个非常忙碌的系统下运行at,能不能指定你的工作在系统较闲的时候才进行呢?可以的,那就是用batch命令吧!
batch:系统有空时才进行的后台任务
其实batch是利用at来进行命令的执行,只是加入了一些控制参数而已。
这个batch神奇的地方在于:它会在CPU工作负载小于0.8的时候,才进行你执行的工作任务。
负载的意思是:CPU在单一时间点所负责的工作数量,不是CPU的使用率。举例来说,如果我有一个程序它需要一直使用CPU的运算功能,那么此时CPU的使用率可能到达100%,但是CPU的工作负载则是趋近于1,因为CPU仅仅负责了一个工作。如果同时执行这样的程序两个,CPU的使用率还是100%,但CPU的负载则变成了2。当CPU的工作负载越大,代表CPU必须要在不同的工作之间进行频繁的工作切换。
其实batch也是利用atp和atrm来管理的。
3、循环执行的例行性工作调度
循环执行的例行性工作调度则是由cron(crond)这个系统服务来控制的。另外,用户也可以进行例行性工作调度,Linux提供给用户控制例行性工作调度的命令是(crontab)。
与at一样,我们也可以限制使用crontab的用户账户。在这两个文件当中,/etc/cron.allow和/etc/cron.deny。
当用户使用crontab这个命令来新建工作调度之后,该项工作就会被记录到/var/spool/cron里面去了,而且是以账号来作为判别的。
注意,crontab -r 命令是删除所有的crontab内容。
3.2、系统的配置文件:/etc/crontab
这个crontab -e 主要是针对cron来设计的,如果是系统的例行性任务时,就需要编辑/etc/crontab这个文件。
基本上,cron这个服务的最低检查限制的是“分钟”,所以cron会每分钟去读取一次/etc/crontab与/var/spool/cron里面的数据内容。因此,只要你编辑完/etc/crontab这个文件,并且将它保存之后,那么cron的设置就自动会来执行。由于crontab是读取到内存中的,所以在你修改完/etc/crontab之后,可能并不会马上执行,这个时候请重启crond这个服务吧。
/etc/crontab这个文件里面支持两种执行命令的方式,一种是直接执行命令,一种则是以目录来规划。
3.3、一些注意事项
资源分配不均问题;
取消不要的输出选项;
安全的检验;
周与日、月不可同时并存。
4、可唤醒停机期间的工作任务
如果你的Linux主机24小时全天、全年无休的服务器之用,那么你只要有atd与crond这两个服务来管理你的例行性工作调度即可。如果你的主机并非24小时开机,那么你的某些例行性任务可能就无法运行,此时就得要用到anacron这个工具了。
4.1、什么是anacron
anacron并不是用来替代crontab的,anacron存在的目的就在于我们上头提到的,处理非24小时一直启动的Linux系统的crontab的执行。所以annacron并不能指定何时执行某项任务,而是以天为单位或者是在开机后立刻进行anacron的操作,它会去检测停机期间应该进行但是并没有进行的crontab任务,并将该任务执行一遍,然后anacron就会自动停止。
anacron读取的时间记录文件(timestamp)了!anacron会去分析现在的时间与时间记录文件所记载的上次执行anacron的时间,两者比较后若发现有区别,那就是在某些时刻没有进行crontab。此时anacron就会开始执行未进行的crontab任务了。
所以anacron其实也是通过crontab来运行的,因此anacron运行的时间通常有两个,一个是系统开机期间运行,一个是写入crontab的调度中,这样才能在特定时间分析系统未进行的crontab工作。
anacron其实是一个程序并非一个服务。
如果 anacron 执行 cron.daily时,它是这样运行的:
1,由/etc/anacrontab分析到cron.daily这项工作名称的天数为1天;
2,由/var/spool/anacron/cron.daily取出最近一次执行anacron的时间戳;
3,由上个步骤与目前的时间比较,若差异天数未1天以上(含1天),就准备进行命令;
4,若准备进行命令,根据/etc/anacrontab的设置将延迟5分钟;
5,延迟时间过后,开始执行后续命令,即“run-parts /etc/cron.daily”这串命令;
6,执行完毕后,anacron程序结束。
所以说,时间戳是非常重要的。anacron是通过该记录与目前的时间差异,了解到是否应该要进行某项任务的工作。
现在知道为甚么隔了一阵才将Linux开机,但是开机后一段时间内系统很忙碌,那就是因为anacron正在执行过去crontab未进行的各项工作制度。