如何想要让自己设计的备份程序可以自动的在系统底下执行,而不需要手动来执行,此时就需要Linux的例行性的工作排成,可分为
单一工作和循环工作,用到了crontab和at这两个命令
crontab : 一种是例行性的,就是每隔一定的周期要来办的事项,要执行crontab 至少让crontab这个这个服务的支持
at :一种是突发性的,就是这次做完以后就没有的那一种 (计算机大降价...) 要执行at命令必须要有atd这个服务的支持,
Linux常见的例行性工作,比方说自动的进行在线更新,自动的进行updatedb更新文件名数据库,自动的作登录当分析
(所以root常常会收到标题为logwatch的信息),这主要是为了能够让系统正常的运行,某些在背景下的工作程序必须要定
时进行的缘故
Linux系统常见的例行性任务有:
1,进行登录档的轮替(log rotate)
Linux 会主动将系统所发生的各种信息都记录下来,所以登录文件会越来越大,此时就要让旧的数据与新的数据分别存放,则可
有效的管理登录信息,这个就是所谓的log rotate的任务
2, 登录文件分析logwatch的任务
系统发生软件问题,硬件问题,资安问题等,大部分的错误信息都会被记录到登录文件中,因此管理员的重要任务之一就是分析
登录档,但是又不可能手动透过vim等软件去查看登录文件,因为数据又大又复杂,因此Linux提供了一只程序【logwatch】来
主动分析登录信息,所以你会发现,你的root老是会收到标题为logwatch的信件,你最好能够看看该信件的内容信息
3,建立locate的数据库
locate指令是通过已经存在的文件名数据库来进行系统上文件名的查询,文件名的数据库被放置到/var/lib/mlocate/中,问题是
这个数据库怎么会自动更新,这就是系统的例行性工作所产生的效果,系统会主动的进行updatedb
4,whatis数据库的建立
与locate数据库类似,whatis也是数据库,也就是说要使用whatis指令时,必须要拥有whatis数据库,而这个数据库也是透过系统
例行性工作排程来自动执行的
5 RPM软件登录文件的建立
RPM是一种软件管理的机制,由于系统可能会常常变更软件,包括软件的新安装,非经常性更新等,都会造成软件文件名的差异
为了方便追寻,系统帮我们将文件名做个排序的记录,有时候系统也会通过排程来帮忙RPM数据库的重新建置
6 移除暂存档
某些软件在运行中会产生一些暂存档,当这个软件关闭,这个暂存档可能不会主动的被移除,有些暂存档则有时间性,总之,为了
不让磁盘容量被耗光,系统透过例行性工作排程执行名为tmpwatch的指令来删除这些暂存档
7 与网络服务有关的分析行为
安装WWW服务软件,那么你的Linux系统通常就会主动的分析该软件的登录文件,同时某些凭证与认证的网络信息是否过期的问题
我们Linux系统也会很亲和的帮你进行自动检查
其实系统会进行的例行性工作与你安装的软件多少有关,某些软件服务会带上分析工具,再加上自己撰写的分析工具,以及第三方
的协议软件的分析软件,你的Linux会多出很多例行性工作,所以我们要了解例行性工作的处理方式
单一工作排程的运作,那就是at这个指令的运作
atd的启动与at运作的方式
事实上,我们使用at这个指令来产生所要运行的工作,并将这个工作以文本文件的方式写入/var/spool/at/目录内,该工作便能等待atd
这个服务的取用与执行了.
并非所有人都可以进行at工作排程,除非是你认可的帐号,否则先不要让他们使用at吧
我们可以利用/etc/at.allow与/etc/at.deny 这两个档案来进行at的使用限制,加上这两个档案后,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指令了
实际运作单一工作排程
将at 加上一个时间
at [-mldv] TIME
at -c 工作号码
选项和参数:
-m 当at的工作完成后,即使没有输出讯息,亦会email通知使用者该工作已完成
-l 相当与atq 可以将目前系统上面的所有该用户的at排程
-d at -d相当与atm 可以取消一个在at排程中的工作
-v 可以使用较明显的时间格式列出at排程中的任务列表
-c 可以列出后面接的该项工作的实际指令内容
TIME:时间格式,这里可以定义出『什么时候要运行 at 这项工作』的时间,格式有:
HH:MM
HH:MM YYYY-MM-DD ex> 04:00 2009-03-17 强制规定在某年某月的某一天的特殊时刻进行该工作!
HH:MM[am|pm] [Month] [Date] ex> 04pm March 17 也是一样,强制在某年某月某日的某时刻进行!
HH:MM[am|pm] + number [minutes|hours|days|weeks] ex> now + 5 minutes ex> 04pm + 3 days 就是说,在某个时间点『再加几个时间后』才进行.
【now + ...】的方式来定义现在过多少时间再进行工作,但有时也需要定义特定的时间来进行
再过五分钟后,将 /root/.bashrc 寄给 root 自己
at now + 5 minutes
at > /bin/mail root -s "testing at job" < /root/.bashrc
at > <EOT> <==这里输入 [ctrl] + d 就会出现 <EOF> 的字样!代表结束!
job 4 at 2009-03-14 15:38
上面这行信息在说明,第 4 个 at 工作将在 2009/03/14 癿 15:38 进行!
而执行 at 会进入所谓的 at shell 环境,让你下达多重指令等待运作!
at -c 4 将上述的第四项工作内容列出来查阅
由于机房预计于 2009/03/18 停电,我想要在 2009/03/17 23:00 关机,执行at 23:00 2009-03-17
at> /bin/sync
at> /bin/sync
at> /sbin/shutdown -h now
at> <EOT>
job 5 at 2009-03-17 23:00
# 您瞧瞧! at 还可以在一个工作内输入多个指令啊
当at执行的时候,会进入一个at shell的环境用来让用户下达指令,建议最好使用绝对路径来下达你的指令,比较不会有问题
由于指令的下达与PATH变量有关,同时与当时的工作目录也有关联(如果有牵涉到档案的话),因此使用绝对路径来下达指令,会
比较一劳永逸的方法,例如:你在/tmp目录下下达【at now 】然后输入【mail root -s "test" <.bashrc】,这个.bashrc的档案会在
哪里? 答案是【/tmp/.bashrc】因此at在运作时,会跑到当时下达at指令的那个工作目录的缘故
如果想要在某个时刻在终端机显示出Hello的字样,然后在at里面下达echo "Hello".等到时间到了,却发现没有任何讯息在屏幕上
这是因为at的执行与终端机环境无关,而所有standard output / standard error output都会传送到执行者的mailbox去,所以在终端机
是看不到任何信息,不过可以透过终端机的装置来处理,例如你在tty1登录,可以使用【echo "Hello" > /dev/tty1】来取代
如果在at shell内的指令没有任何的讯息输出,那么at不会发mail个执行者,如果你想要让at无论如何都发一封email 告知你是否执行了
指令,那么可以使用【at -m 时间格式】来下达指令,at就会传送一个讯息给执行者,而不论该指令执行有无讯息输出了
at还有一个很棒的有点就是【背景执行】,由于at工作排程的使用上,系统将该项at工作独立出你的bash环境中,直接交给系统的atd
程序来接管,因此,当你下达了at的工作指令后就可以立刻脱机了,剩下的交给Linux管理即可,所以长时间的网络工作时,使用at
可以让你免除网络断线后的困扰
atq可以来查询任务,而atm来删除错误的任务,如果不想在某个非常忙碌的系统下运作at,可以使用bash指令
其实batch也是利用at来执行指令的下达,只是加入了一些参数,batch会在CPU工作负载小于0.8的时候,才进行你所下达的工作任务
负载的意思是CPU在单一时间点所负载的工作数量,不是CPU的使用率,若我只有一只程序一直使用CPU的运算功能,那么此时CPU
的使用率可能达到100%,但是CPU的工作负载则是趋近于【1】,因为CPU负责一个工作,如果同时执行这样的程序两支的话,CPU
的使用率还是100,但是工作负载则变成2了
当 CPU 的工作负载越大,代表 CPU 必须要在不同癿工作之间进行频繁的工作切换,因为一直切换工作,会导致系统忙碌,系统如此忙碌
还要执行at ,不太合理,所以才有batch指令的产生
batch下达指令和at相同
执行batch 23:00 2009-3-17 这个命令,若当时负载大于0.8的话,则会推迟执行该命令,其实 batch 也是使用 atq/atrm 来管理的
相对于at仅执行一次的工作,循环执行的例行性工作排程则是由crond这个系统服务来控制的,这个服务默认是启动的,另外,由于
使用者自己也可以进行例行性工作排程,Linux也提供了crontab这个指令
使用者的设定,和at一样,使用crontab的使用者帐号,使用的限制数据有
/etc/cron.allow: 将可以使用 crontab 的账号写入其中,若不在这个档案内的使用者则不可使用 crontab
/etc/cron.deny: 将不可以使用 crontab 的账号写入其中,若未记录到这个档案当中的使用者,就可以使用crontab
与 at 很像吧!同样癿,以优先级来说, /etc/cron.allow 比 /etc/cron.deny 要优先, 而判断上面,
这两个档案只选择一个来限制而已,因此,建议你只要保留一个即可, 免得影响自己在设定上面的判
断!一般来说,系统默认是保留 /etc/cron.deny , 你可以将不想让他执行 crontab的那个使用者写入 /etc/cron.deny 当中,一个账号一行!
当用户使用 crontab 这个指令来建立工作排程之后,该项工作就会被记录到 /var/spool/cron/ 里面去了
而且是以帐号来作为判别的,例如dmtsai使用crontab后,他的工作会被记录到/var/spool/cron/dmtsai里面去,但是,不要
尝试去编辑该文档,因为可能由于输入语法错误,会导致无法执行cron,另外cron执行的每一项工作都会被记录到/var/log/cron
这个登录档中,所以,如果你的Linux不知道是否被移植木马时,可以搜索一下/var/log/cron这个登录档
crontab [-u username] [-l|-e|-r]
-u :只有 root 才能进行这个任务,亦即帮其他使用者建立/移除 crontab 工作排程;
-e :编辑 crontab 癿工作内容
-l :查阅 crontab 癿工作内容
-r :移除所有的 crontab的工作内容,若仅要移除一项,请用 -e 去编辑
crontab -e
0 12 * * * mail dmtsai -s "at 12:00" < /home/dmtsai/.bashrc 设置每天的12点发信给自己
#分 时 日 月 周 |<==============指令串
# 此时会进入vi 的编辑画面让您编辑工作!注意到,每项工作都是一行
预设情况下,使用者只要不被列入/etc/cron.deny当中,那么就可以直接下达【crontab -e】去编辑自己的例行性命令了
在vim编辑页面输入完毕后输入:wq储存后就可以离开vi了,每项工作的格式都是具有六个字段
代表意义 分钟 小时 日期 月份 周 指令
0-59 0-23 1-31 1-12 0-7 指令
周的数字为 0 戒 7 时,都代表『星期天』的意思
特殊字符 * 代表任何时刻都接受的意思
, 代表分割时段的意思 例如3点和6点 就会显示3,6
- 代表一段时间范围内 8点到12点每二十分钟 20 8-12 * * *
/n 代表间隔多长时间执行一次
30 16 * * 5 mail friend@his.server.name < /home/dmtsai/friend.txt 每周五下午4:30告诉你的朋友星期六的约会不要忘记
命令最好使用绝对路径
crontab -l 查看全部的例行性工作
crontab -r 删除全部的例行性工作
系统的配置文件 : /etc/crontab
这个【crontab -e】是针对使用者的cron来设计的,如果是【系统的例行性任务】时,就不需要crontab -e来管理你的例行性
工作排程了,你只要编辑/etc/crontab这个档案就可以了,有一点要注意,那就是crontab -e这个crontab其实是
/usr/bin/crontab这个执行档,但是/etc/crontab是一个纯文本档,你可以使用root身份去编辑这个档案
基本上, cron 这个朋务的最低侦测限制是『分钟』,所以会每分钟去读取一次/etc/crontab与/var/spool/cron里面的数据内容
因此,只要编辑完/etc/crontab这个档案,并且将他储存之后,那么cron的设定就自动的会来执行了的,如果没有执行的话
就手动的将crond这个服务重启一下
/etc/crontab这个文件内容与刚刚下达的crontab -e的内容几乎完全一模一样,只有几个地方不太相同
MAILTO = root : 当/etc/crontab这个档案中的指令发生错误时,或者该工作执行结果有STDOUT/STDERR时,会将错误
讯息或者屏幕讯息发送一份邮件给root ,由root并无法在客户端中以POP3之类的软件收信,通常将这个改成自己的帐号
好让我随时了解系统的状况,例如MAILTO=dmtasi@my.host.name
PATH=.... : 这里就是输入执行文件的搜寻路径!使用默认的路径设定就已经很足够了
01 * * * * root run-parts /etc/cron.hourly: 后面的/etc/cron.hourly 这个指令会将这个文件捉出来,如果想让每小时
自动执行某个命令的话,将该指令写成script ,并将该档案放到/etc/cron.hourly/目录下即可,若执行ll /etc/cron.daily
就可看到一堆档案,那些档案就是系统提供的script,而这堆sctipts将会在每天的凌晨4:02开始运作,所以makewhatis
updatedb rpm rebuild等等的任务都是在半夜执行的
因此 /etc/crontab 这个档案里面支持两种下达指令的方式, 一种是直接下达指令,一种则是以目录来规划,
指令型态
01 * * * * dmtsai mail -s "testing" kiki < /home/dmtsai/test.txt
以 dmtsai 这个使用者的身份,在每小时执行一次 mail 指令
目录规划
*/5 * * * * root run-parts /root/runcron
建立一个 /root/runcron 的目录,将要每隔五分钟执行的『可执行文件』都写到该目录下, 就
可以让系统每五分钟执行一次该目录下的所有可执行文件。
执行侦测网络流量时,我们希望每五分钟侦测分析一次,可以这样写:*/5 * * * * root /bin/mrtg /etc/mrtg/mrtg.cfg
让系统可以每两分钟去执行这个目录下的所有可以执行的档案,我们可以写下如下的这一行在/etc/crontab中
*/2 * * * * root run-parts /etc/cron.min
一些注意事项
1.不要让很多个工作都是在每五分钟要执行一次的,那么这么多的动作在同一时刻进行会很耗系统资源的,此时要好好的分配一些运行时间
在使用大量的crontab的时候,会造成系统相当的繁忙
有侦测主机流量癿信息,包括:
流量 区域内其他 PC 癿流量侦测 CPU 使用率 RAM 使用率 在线人数实时侦测
2. 取消不要的输出项目,例如当有执行成果或者执行的项目中有输出的数据,将数据mail给设定的帐号,那么一直出错的话,可以直接将输出
的结果输出到/etc/null 这个垃圾桶当中就好了
3. 安全的检验 可以籍由/var/log/cron的内容来观察是否有【非你设定的cron被执行】这个时候就需要小心一点可能是木马执行的程序
4. 周与日月不可同时并存
5. 可唤醒停机期间的工作任务
anacron 的目的就在于我们一直说的处理并非一直启动的Linux系统的crontab的执行,所以anacron不能指定何时执行某项任务
而是以天为单位,或者开机后立刻进行anacron,他会侦测停机期间应该进行但没有进行的crontab任务,并将其执行一遍,anacron就会立刻停止了
例如Linux主机在周末假日大家都不在所以没有必要开启,因此你的Linux是周末都会关机两天,但是你的crontab大多在每天凌晨及周日的早上进行各项
任务,偏偏你又关机了,此时系统很多crontab的任务无法执行,anacron刚好就可以解决这个问题了
那么anacron又是怎么知道我们的系统啥时候关机呢?这就的要使用anacron读取的时间记录文件(timestamps)了aracron会去分析现在的时间与时间记录文件
所记载的上次执行anacron的时间,两者比较有差异,那就是某些时候没有进行crontab,此时anacron就会开始执行未执行的crontab任务了,所以
anacron其实也是透过crontab来运行的,因此anacron动作的时间通常有两个,一个是系统开机期间运作,一个是写入crontab的排程中,这样才能在特定
时间分析未进行的crontab工作
anacron 与 /etc/anacrontab
anacron其实是一只程序并非一个服务,这支程序已经进入crontab的排程,
ll /etc/cron*/*ana*
/etc/cron.daily/0anacron
/etc/cron.monthly/0anacron
/etc/cron.weekly/0anacron
刚好是每天、每周、每月有排程的工作目录!查阅一下每天癿任务
cat /etc/cron.daily/0anacron
if [ ! -e /var/run/anacron.pid ]; then
anacron -u cron.daily
fi
所以其实也仅是执行anacron -u的指令
anacron [-sfn] [job]..
anacron -u [job]..
选项不参数:
-s :开始一连续癿执行各项工作 (job),会依据时间记录文件癿数据判断是否来行;
-f :强制进行,而不去判断时间记录文件癿时间戳;
-n :立刻进行未进行癿任务,而不延迟 (delay) 等待时间;
-u :仅更新时间记录文件癿时间戳,不进行任何工作。
job :由 /etc/anacrontab 定义的各项工作名称。
所以我们发现其实 /etc/cron.daily/0anacron 仅进行时间戳的更新,而没有进行任何 anacron 的动作
anacron 癿进行其实是在开机完成后才进行的一项工作任务,你也可以将anacron 排入 crontab 的排程中
但是为了担心 anacron 误判时间参数,因此 /etc/cron.daily/ 里面
的 anacron 才会在档名之前加个 0 (0anacron),让 anacron 最先进行!就是为了让时间戳先更新!以
避免 anacron 误判 crontab 尚未进行任何工作癿意思
接下来看一下/etc/anacrontab
1 65 cron.daily run-parts /etc/cron.daily
7 70 cron.weekly
30 75 cron.monthly run-parts /etc/cron.monthly
指令串通常与crontab的设定相同
anacron 若下达『 anacron -s cron.daily 』时,他会这样运作癿:
1. 由 /etc/anacrontab 分析到 cron.daily 这项工作名称癿天数为 1 天;
2. 由 /var/spool/anacron/cron.daily 取出最近一次执行 anacron 的时间戳;
3. 由上个步骤不目前的时间比较,若差异天数为 1 天以上 (吨 1 天),就准备运行指令;
4. 若准备运行指令,根据 /etc/anacrontab 的设定,将延迟 65 分钟
5. 延迟时间过后,开始执行后续指令,亦即『 run-parts /etc/cron.daily 』这串指令;
6. 执行完毕后, anacron 程序结束。
时间戳是非常重要的,anacron 是透过该记录与目前的时间差异,了解到是否应该要进行某项任务的工作
举例来说,如果我的主机在 2009/03/15(星期天) 18:00 关机,然后在 2009/03/16(星期
一) 8:00 开机,由于我的 crontab 是在早上 04:00 左右进行各项任务,由亍该时刻系统是关机的,因
此时间戳依旧为 20090315 (旧的时间), 但是目前时间已经是 20090316 (新的时间),因此 run-parts
/etc/cron.daily 就会在开机过 65 分钟后开始运作了。
通过设定 chkconfig --list anacron查看到anacron这个程序是在开机的时间就会执行anacron,所以开机后就会执行一系列关机时未执行的那些crontab程序了
所以 anacron 并丌能挃定何时执行某项仸务, 而是以天
为单位戒者是在开机后立刻迚行 anacron 癿劢作,他会去侦测停机期间应该迚行但是并没有迚行癿
crontab 仸务,并将该仸务执行一遍后,anacron 就会自劢停止了
所以 anacron 并丌能挃定何时执行某项仸务, 而是以天
为单位戒者是在开机后立刻迚行 anacron 癿劢作,他会去侦测停机期间应该迚行但是并没有迚行癿
crontab 仸务,并将该仸务执行一遍后,anacron 就会自劢停止了