Linux crontab at 例行性工作排程

如何想要让自己设计的备份程序可以自动的在系统底下执行,而不需要手动来执行,此时就需要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 就会自劢停止了



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值