第8章 例行性命令
1 什么是例行性命令
简单的可以将例行性命令理解为linux可以自动执行的命令。在linux下通常有两种工作排程的方式:
• 一种是例行性的,就是每隔一定的周期
• 一种是突发性的,就是这次做完以后就没有的那一种
那么在 Linux 底下如何实现这两个功能呢?
• at : 这个工作仅执行一次就从 Linux 系统中的排程中取消;
• crontab : 这个工作将持续例行性的做下去
2 Linux 系统的例行性命令
服务器常见的例行工作有:
• 进行数据轮替 ( log rotate ):!由于登录文件会越来越大,所以需要适时适量的将登录档备份,并以新开的文件来进行记录,这样效率会比较好,因此就需要使用 log rotate!这个步骤重要了!尤其是在 log file 的选项当中,是系统预设的重要工作之一;
• rpm 数据库的建立:虽然 RPM 数据库会在你以 RPM 安装之后即更新到RPM 数据库当中去,但是难保会有漏网之鱼,所以系统也会设定每隔依段时间自动的搜集系统上面的 RPM 数据库来建置一番;
• 建立 locate 的数据库:是否还记得为何使用 locate 这个指令时,搜寻速度超快!那是因为 Linux 系统上将文件与路径都记录在数据库里面了!所以使用 locate 的时候,直接指向数据库去 (/var/lib/slocate/slocate.db ) ,但是这个文件的更新是每天一次!所以当你今天更新的文件,使用 locate 反而可能会找不到。
• 进行程序的分析:每隔依段时间会进行程序的分析,如果发现有僵尸程序的时候,就会将他删去,以保持内存的工作能力!
• 登录档视察:这个东西是在 Red Hat 7.1 以后才出现的东西,后来太好用了,所以被拿到旧版的 Red Hat 里面去使用!基本上就是分析登录档啦!然后据以解析有问题的纪录文件,以维护主机的安全性!
• 指纹数据库的比对
3 突发性工作设置
仅执行一次的工作排程如果仅要执行一次的工作,就使用 at 这个指令吧!这个指令其实就是 atd 这个服务啦!如果是在 Red Hat 系统下,可以使用:ntsysv 或 setup
上面这个指令可以查看 atd 在 run-level 正确的情况中,是否会在开机的时候被启动!基本上, atd 是预设开启的。
下达 at 这个动作会将工作排程写入 /var/spool/at 这个目录,然后等待系统将之执行。此外,这个 at 指令虽然预设是所有人都能进行,但是可以经由 root 的规范来限制使用的人口。限制的方法是通过使用 /etc/at.allow(deny) 这两个文件来限制。
3.1限制使用者原理
当使用者执行 at 时,系统会:
1. 先找寻 /etc/at.allow 这个文件,写在这个文件中的使用者才能使用at ,没有在这个文件中的使用者则不能使用 at ( 即使没有写在at.deny 当中 );
2. 如果没有 /etc/at.allow 就寻找 /etc/at.deny 这个文件,若写在这个at.deny 的使用者则不能使用 at ,而没有在这个 at.deny 文件中的使用者,就可以使用 at ;
3. 如果两个文件都不存在,那么只有 root 可以使用 at 这个指令。
Linux 预设情况下,只有 /etc/at.deny 这个文件,且这个文件的内容为空白的,由于内容没有任何使用者,所以当然所有人都可以使用 at。如果不想要某个使用者使用 at 时,那么将该使用者账号写到 /etc/at.deny这个文件中即可。
3.2 at 的语法
[test @test test]# at [-m] TIME (下达工作指令)
[test @test test]# atq (查看目前的工作排程)
[test @test test]# atrm [jobnumber] (删除排程)
参数说明:-m :执行 at 所规范的工作排程时,将屏幕输出结果mail 给下达指令的使用者
TIME :时间的格式有底下几个:
² HH:MM YYYY-MM-DD ex> 04:00 2002-05-30 (五月三十号四点执行)
² HH[pm;am] + number [hours;days;weeks] ex> 4pm + 3 days (在过 3 天的下午 4 点)
² HH:MM ex> 12:00 (今天的 12 点执行)
² HH[pm;am] [Month] [Day] ex> 1pm May 30
jobnumber:一个 at 工作排程的编排顺序
范例:
[test @test test]# at 5pm
warning: commands will be executed using (in order) a) $SHELL b) login shell c) /bin/sh
at> mail -s test test < /home/test/.bashrc
at> <EOT> <==这里是按下 [Ctrl] + D 就可以离开了!
[test @test test]# atq <==窥视一下你(test)目前有多少工作?
[test @test test]# atrm 5<==删除第 5 号工作
4 循环执行的例行性命令服务
当下达 crontab 的指令之后,会将你的命令写入 /var/spool/cron 这个目录当中。例如 test 下达了他的 crontab 命令,那么就会自动产生 /var/spool/cron/test 这个文件,请注意,这个文件不能直接编辑。然后执行的指令记录会放置在 /var/log/cron 这个文件中。所以,『如果您的 Linux 系统不知道是否被木马入侵时,可以搜寻一下/var/log/cron 这个记录挡,视察看看有没有被搞鬼?
4.1 crontab 的指令语法
[test @test test]# crontab [-u user] [-l | -e | -r]
参数说明:-u user :只有 root 能下达的参数,视察或编译其它使用者的 crontab 内容
-l :列出 crontab 的内容
-e :编辑 crontab 的内容
-r :删除 crontab 的内容
范例:一般使用者 test 要在每天的 12:00 发信给自己:
[test @test test]# crontab -e
0 12 * * * mail test < /home/test/test.txt
4.2 指令格式
分时日月周 |========指令列===============|
在真正执行命令之前(就是 mail test </home/test/test.txt )总共有五个数字,这五个数字分别代表:
分 (0-59)小时 (0-23)日期 (1-31)月份 (1-12)周 (0-6)
数字代表的意义 分钟 小时 日期 月份 星期几
范围 0-59 0-23 1-31 1-12 0-6 (0 为星期天)
如果是『 * 』的时候,代表所有数字都适用的意思。
例:假如你的女朋友生日是 5 月 2 日,你想要在 5 月 1 日的 23:59 发一封信给她
[test @test test]# crontab -e
59 23 1 5 * mail pigpp < /home/test/lover.txt
例:假如你每隔五分钟要去check你的一个名为 test.sh 的批次档一次,则:
[test @test test]# crontab -e
59 23 1 5 * mail pigpp < /home/test/lover.txt
*/5 * * * * /home/test/test.sh <==新加入的一个排程!
注意:
² 那个 crontab 每个人都只有一个文件,就是在 /var/spool/cron 里面的文件!
² 指令的路径最好是下达绝对路径,这样比较不会找不到执行的文件;
² 第一个数字 */5 表示『每五分钟执行一次』的意思。
4.3查看使用者目前的 crontab 的工作排程?
[test @test test]# crontab -l <==这个 -l 是 L 的小写
4.4如何删除排程
[test @test test]# crontab -r
注意:如果只是要删除某个 crontab 的工作项目,那么请使用 crontab -e 来重新编辑即可!如果使用 -r的参数,是会将所有的 crontab 数据内容都删掉的。
4.5 系统的例行性任务的设置
系统的 crontab 设定这个 crontab -e 是针对使用者的cron来设计的,如果是『系统的例行性任务时,你只要编辑 /etc/crontab 这个文件就可以。
基本上, cron 这个服务的最低侦测限制是分钟,所以 cron 会每分钟去读取一次 /etc/crontab 与 /var/spool/cron 里面的数据内容,因此,只要你编辑完/etc/crontab 这个文件,并且将他储存之后,那么 crontab 的设定就自动的会来执行了!
注意:在 Linux 底下的 crontab 会自动的帮我们每分钟重新读取一次/etc/crontab 的例行工作事项,但是某些原因或者是其它的 Unix 系统中,由于 crontab 是读到内存当中的,所以在你修改完 /etc/crontab 之后,可能并不会马上执行,这个时候请重新启动 crond 这个服务:
/etc/rc.d/init.d/crond restart 注意:/etc/rc.d/init.d 保存了系统开机自启动的服务
4.6 /etc/crontab文件和目录规划
我们来分析/etc/crontab 这的文件的内容:
[root@test /root]# vi /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 <==每个月执行的工作
解释:
² MAILTO=root:当 /etc/crontab 这个文件中的例行性命令发生错误时,会将错误讯息或者是屏幕显示的讯息传给谁
² 01 * * * * root run-parts /etc/cron.hourly:在五个数字后面接的是 root ,这一行代表的是执行的层级为 root 身份。
² run-parts 代表后面接的 /etc/cron.hourly 是一个目录内(/etc/cron.hourly)的所有可执行档,这也就是说,每个小时的 01 分,系统会以 root 层级的使用者去 /etc/cron.hourly 这个目录下执行所有可以执行的档案,后面的三行也都是类似的意思。你可以到 /etc/ 底下去看看,系统本来就预设了这四个目录了!你可以将每天需要执行的命令直接写到 /etc/cron.daily即可,就不需要使用到 crontab -e程序。
基本上 /etc/crontab 里头支持两种下达指令的方式,一种是直接以指令型态下达,一种则是以目录规划来下达;
• 指令型态:
01 * * * * test mail -s test test < /home/test/test.txt
使用者是 test, 且在每个小时执行一次指令 mail ...
• 目录规划:
*/5 * * * * root run-parts /root/runcron
建立一个 /root/runcron 的目录,将要每隔五分钟执行的可执行档都写到该目录下,就可以让系统每五分钟执行一次该目录下的所有可执行档。
此外,与 crontab -e 规划当中最不相同的就是多了一个『使用者层级』的概念,通常我们都是以 root 的角度来规划例行性命令,但是总有不需要 root 的指令吧!就可以使用这个层级来规范该程序的使用者属于谁!
假设你现在要作一个目录,让系统可以每 2 分钟去执行这个目录下的所有可以执行的文件,你可以写下如下的这一行在/etc/crontab 中:*/2 * * * * root run-parts /etc/cron.min当然, /etc/cron.min 这个目录是需要存在的!
4.7在做系统例行性工作规划时要注意的问题
4.7.1 资源分配不均
当大量使用 crontab 的时候,总是会有问题发生的,最严重的问题就是系统资源分配不均的问题,比如有侦测流量的信息,包括:
• 流量• 区域内其它 PC 的流量侦测• CPU 使用率• RAM 使用率• 在线人数实时侦测
如果每个流程都在同一个时间启动的话,!那么在某个时段时,系统会变的相当的繁忙,所以,这个时候就必须要分别设定。
可以这样做:
[root@test /root]# vi /etc/crontab
1,6,11,16,21,26,31,36,41,46,51,56 * * * * root ........
2,7,12,17,22,27,32,37,42,47,52,57 * * * * root ........
3,8,13,18,23,28,33,38,43,48,53,58 * * * * root ........
4,9,14,19,24,29,34,39,44,49,54,59 * * * * root ........
那个『 , 』分隔的时候,请注意,不要有空格符,如此一来,则可以将每五分钟工作的流程分别在不同的时刻来工作,则可以让系统的执行较为顺畅。
4.7.2 取消不要的输出项目
另外一个困扰发生在当有执行成果或者是执行的项目中有输出的数据时,该数据将会 mail 给 MAILTO 设定的账号,当有一个排程一直出错(例如 DNS的侦测系统当中,若 DNS 上层主机挂掉,那么你就会一直收到错误讯息)怎么办?直接以命令重导向将输出的结果输出到 /dev/null 这个垃圾桶当中就好了。