周期性进程这一部分的内容需要很多的实践才能看出来。所以这里也就仅仅是学习周期性进程的管理方式,做一个理论上的理解。实际以后当然还是需要很多的锻练的。
系统管理员应当让更多的任务能够自动完成以减轻系统管理的压力。为此应当选择适当的辅助工具。首先是能提高管理效率的系统命令。比如使用adduser来代替手动向系统中添加用户。其次是使用各种各样的自动脚本完成管理任务。这种情况下就要建立所谓的系统管理工具集或脚本集之类的工具了。然后我们也应该使用自动运行或者计划任务,以让我们有一个充分的休息机会,让那些经常重复的工作变成计算机自动会完成的工作。
关于cron工具
unix下周期执行的任务一般由cron这个守护进程来处理。在系统工作的时候它通常都会保持运行。cron在工作的时修读取一个或多个配置文件,并启动sh来完成其中的任务。因此差不多所有能够手工从shell完成的任务都能通过cron完成。
cron最初出现在20世纪70年代的UNIX家族中。linux发行版本所带的cron称为ISC cron或者Vixie-cron.它是由Paul Vixie重写的,并提供了许多新的功能,减少了使用cron遇到的麻烦。
cron的配置文件称为crontab.cron在三个地方查找crontab文件。/var/spool/cron,在SUSE上是/var/spool/cron/tabs./etc/cron.d和/etc/crontab.每个用户的crontab文件都保存在/var/spool/cron目录下,以用户的名称命名。一般每个用户只能有一个crontab文件。cron会使用文件名作为运行命令时所使用的UID.
计划任务需要权限的限制,以使得普通用户多数时候只在其登录期间有对于计算机的使用权限。更多时候,计划任务作为系统管理的手段。
在/etc/cron.d以及/etc/crontab里的文件格式与用户的crontab文件略有不同,因为前者允许以任何身份执行命令。/etc/crontab供系统管理员手工维护,而/etc/cron.d里常存放软件包所需要的crontab项目。
cron启动时检查它的所有配置文件(但cron一般随系统的启动而启动),并把它们保存到内存当中。每一分钟cron就会醒来一次,检查crontab的修改时间,并重新载入有修改的文件。然后在返回睡眠状态前执行这一分钟安排要执行的所有任务。
cron通过syslog为它的活动做日志。
crontab文件的格式
crontab文件中以#开头的行代表注释。每个非注释行包括6或7个字段,它代表的含义为:
minute hour day month weekday [username] command
前六个字段都会用空白分开,但是到了command后,所有空格都算在command里面。用户自己的crontab文件中没有username项。
日期与时间格式会在很多地方用到,所以得有一个全局的思维才行。一般来说,首等应清楚表示的区间在一天以内还是一个比较长的日期。其次要确定所表示的地区。另外就是从大到小还是从小到大。我们可以这样进行分类:
- 时间内有时分秒,表达一天内的时间。次要的标准有时辰,早中晚等;
- 日期内有年月日。次要的还有星期,公元;
- 时区则是要遵守国际相关的规范了;
- 按表示顺序,有从大到小,也有从小到大,crontab里就是从小到大。
crontab每的时间字段中可以采用数值表示,可以使用通配符,可以用逗号,也可以用范围,表示的是“或”的关系。因为cron的含义即是这一分钟要不要运行该程序。crontab中的命令可以使用百分号作为换行。不过为了简便,用一个shell命令还是很好的。
更多细节见手册页crontab(5).
crontab的管理
crontab filename用于把文件安装为crontab文件。它将替换用户原来的版本。更多的用法参考crontab命令帮助。
特别提醒的是,直接使用crontab命令将会要求用户输入crontab.如果这时使用C-D会覆盖掉原来的配置。因此一般要使用C-C来终止crontab程序,以免用户覆盖。
/etc/cron.allow与/etc/cron.deny这两个配置文件用于限制用户提交crontab文件的权限。有allow的时候先通过allow里的用户,未通过则禁止用户登录。无allow文件时查deny里的用户。如果都没有,就会采用cron默认的设置。在大多数系统下,默认只允许root提交crontab.因此既不在allow又不在deny里的用户会被禁止提交crontab文件。
cron的这种设置与acl还不同。在acl中,中间过程只有肯定权,没有否定权。
分析crontab程序的权限也比较有意思。可以知道它是一个setuid的程序。实际运行的时候用户是root.
为了方便管理,通常还在/etc下建立了cron.daily,cron.weekly等脚本。里面的文件会自动每天或者每周运行一次(只需写好相应命令即可)。
cron的通常用法
使用cron非常要求对系统有某种程度的理解。在unix下文件的删除工作往往得自己完成。此外,在网络环境中分发配置文件也常通过cron完成。然后,有些日志文件得自己完成分割。
其它日程安排程序
其实日程安排要比日程安排程序更好理解一些。一个好的日程安排程序关键是能不能表达日程安排的某种逻辑。相关的替代软件有anacron和fcron等。
日程安排思考
计划任务在Windows下是和开机启动混合在一起的。但是unix经常很长时间不关机的,于是就采用了开机脚本和计划任务相分隔的做法。不过因为cron守护进程一直在运行,用户当然也能够很容易地编写一个脚本运行相关的任务。比如使用一个咨询文件就可以办到只在开机的时候运行一次。我们很显然能发现。一旦计划任务程序开始运行,只要相关的脚本能根据系统状态作出某种反应,把日程安排改造成开机启动也不是一件困难的事。
习题与思考
在此次学习中,我们并没有接触到cron的配置。因此关于性能的很多问题都没有涉及到。实际上如果同一网络多台主机同时运行cron时可能会造成一些问题。所以建议cron通过调用脚本间接调用程序。而脚本里有诸如sleep 5这样的代码。
关于管理crontab的权限
一般来说一个用户因为使用不合理的crontab文件。系统管理员应当删除其crontab文件并禁止它的crontab权限。
盲目地复制一个文件夹下以.开头的文件安全么
这个当然是不安全的。一个目录的inode里包含自己和它的父目录。如果我们这样复制文件,就会使得所复制的文件追溯到它的同级目录里。
系统分析的一个应用
cron经常会和邮件系统结合在一起。除了在完成计划任务时把输出发到用户的邮箱,它还可以让用户自己通过shell发送自己感兴趣的内容。