一,什么是例行性工作排程?
计划任务:比如每天,每周,每月,每年或者指定时间需要执行的工作任务
1,Linux工作排程的种类:at,cron
a)at :at 处理仅执行一次任务,依赖于atd服务
b)crontab :crontab处理循环的任务, 可循环的时间为分钟、小时、每周、每月或每年等。 crontab 除了可以使用指令执行外,也可以编辑 /etc/crontab 来支持。 依赖于crond服务
2,Linux上常见的例行性工作
(1)进行 登录记录的轮询(log rotate)
(2)登录文件分析logwatch的任务
(3)建立locate数据库
(4)whatis数据库建立
(5)RPM软件登录文件的建立
(6)移除暂存档,tmpwatch指令来删除暂存档
(7)与网络服务有关的分析行为
二、仅执行一次的工作排程
1,atd的启动与at运行的方式
(1)atd启动
# yum安装atd服务
yum install -y at
# 启动atd服务
/etc/init.d/atd restart
# 设置开机启动项
chkconfig atd on
(2)at运行流程
a)at指令编写要进行的任务
b)将任务以文本方式写入/vat/spool/at目录内
c)该任务就可以等待atd服务调用和执行
(3)at的安全限制
利用/etc/at.allow和/etc/at.deny俩个文件限制可以进行at的使用
a)先查询/etc/at.allow文件,如果有才能使用at,否则不能使用at(即使没有写在at.deny中)
b)如果/etc/at.allow不存在,就寻找/etc/at.deny这个文件,若写在这个at.deny的使用者则不能使用at,而没有在这个at.deny文件中的使用者,就可以使用at
c)如果这俩个文件都不存在,那么只有root可以使用 at这个指令
2,实际运行单一工作排程
(1)语法:
at [-mldv] TIME
at -c 工作号码
选项与参数:
-m :当at的工作完成后,即使没有输出信息,也会以email通知使用者该工作已完成。
-l :at -l 相当于atq,列出目前系统上面得所有该用户的 at 排程;
-d :at -d 相当于 atrm ,可以取消一个在 at 排程中的工作;
-v :可以使用较明显的时间格式列出 at 排程中的任务;
-c :可以列出后面接的该项工作的实际指令内容。
TIME:时间格式,这里可以定义出什么时候要进行 at 工作的时间
格式有:
HH:MM 在今日的 HH:MM 时刻进行,若该时刻已超过,则明天的 HH:MM 进行此工作 ex> 04:00
HH:MM YYYY-MM-DD 强制指定时间进行执行任务 ex> 04:00 2016-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
(2)at管理
atq
atrm [jobnumber]
(3)例子:
a)再过五分钟后,将 /root/.bashrc 寄给 root 自己
at now + 5 minutes
at> /bin/mail root -s "testing at job" < /root/.bashrc
at> <EOT>
job 4 at 2016-03-17 15:38
# 上面这行信息在说明,第 4 个 at 工作将在 2016/03/17 的 15:38 执行任务
b)将上面的第 4 项工作内容列出来查看
at -c 4
#!/bin/sh
# atrun uid=0 gid=0
# mail root 0
umask 22
(4)常用环境
a)脱机继续工作的任务
b)用于突发状况,
(5)batch:系统有空时才进行背景任务(会在 CPU 工作负载小于 0.8 的时)
使用方式和at一样
三,循环执行的例行性 工作排程
1,使用者的设置
使用者想要建立循环型工作排程时,使用的是 crontab 命令;
限制使用 crontab 的使用者账号:
/etc/cron.allow:将可以使用 crontab 的账号写入其中,若不在则不能使用 crontab;
/etc/cron.deny:记录不可以使用 crontab 的账号,若未记录、就可以使用crontab 。
说明:
当用户使用crontab创建计划任务后,会被记录到/var/spool/cron里面,以用户名创建文件。
例如,test用户使用crontab后,工作会 被记录到/var/spool/cron/test里
cron执行的计划任务会 记录到 /var/log/cron日志文件中
2,语法:
crontab [-u username] [-l|-e|-r]
选项不参数:
-u :只有 root 才能执行,即帮其他使用者创建/删除 crontab 计划任务
-e :编辑 crontab 的工作内容
-l :查阅 crontab 的工作内容
-r :删除所有的 crontab计划任务,若仅要删除一项,请用 -e 去编辑。
例如:
# crontab -l
*/5 * * * * /bin/sh /home/maintain/subsistence.sh >/dev/null 2>&1
0 2 * * * /usr/sbin/ntpdate -u clepsydra.dec.com tick.ucla.edu ntp.nasa.gov
代表意义 | 分钟 | 小时 | 日期 | 月份 | 周 | 命令 |
数字范围 | 0-59 | 0-23 | 1-31 | 1-12 | 0-7(0和7都为星期日) | command |
说明 :
特殊字符 | 代表意义 |
*(星号) | 任何时刻 |
,(逗号) | 代表分隔时段。如计划任务是3:00和6:00时,就会是:0 3,6 * * * command |
-(减号) | 代表一段时间范围内,如8点到12点之间的每小时的20分执行,20 8-12 * * * command |
/n(斜线) | 每隔n单位间隔,例如每五分钟执行一次,则:*/5 * * * * command 也可以写成 0-59/5 |
3,系统的配置文件: /etc/crontab
crontab -e是针对使用者的cron
/etc/crontab 是对系统的例行性任务
cron服务最低间隔为分钟,所以cron会每分钟去读取一次/etc/crontab与/var/spool/cron目录
(1)/etc/crontab文件内容
# cat /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
(2)run-parts脚本内容
# cat /usr/bin/run-parts
#!/bin/bash
# run-parts - concept taken from Debian
# keep going when something fails
set +e
if [ $# -lt 1 ]; then
echo "Usage: run-parts <dir>"
exit 1
fi
if [ ! -d $1 ]; then
echo "Not a directory: $1"
exit 1
fi
# Ignore *~ and *, scripts
for i in $1/*[^~,] ; do
[ -d $i ] && continue
# Don't run *.{rpmsave,rpmorig,rpmnew,swp} scripts
[ "${i%.rpmsave}" != "${i}" ] && continue
[ "${i%.rpmorig}" != "${i}" ] && continue
[ "${i%.rpmnew}" != "${i}" ] && continue
[ "${i%.swp}" != "${i}" ] && continue
[ "${i%,v}" != "${i}" ] && continue
if [ -x $i ]; then
$i 2>&1 | awk -v "progname=$i" \
'progname {
print progname ":\n"
progname="";
}
{ print; }'
fi
done
exit 0
(3)根据run-parts这个script脚本,所以/etc/crontab文件里面支持俩种方式:
a)命令文件:
0 2 * * * /usr/sbin/ntpdate -u clepsydra.dec.com tick.ucla.edu ntp.nasa.gov
b)按照目录:
02 4 * * * root run-parts /etc/cron.daily
4,注意事项
(1)资源分配不均的问题
vi /etc/crontab
1,6,11,16,21,26,31,36,41,46,51,56 * * * * root CMD1
2,7,12,17,22,27,32,37,42,47,52,57 * * * * root CMD2
3,8,13,18,23,28,33,38,43,48,53,58 * * * * root CMD3
4,9,14,19,24,29,34,39,44,49,54,59 * * * * root CMD4
(2)取消不要的输出信息
>/dev/null 2>&1
(3)安全检验,/var/spool/cron
(4)周与日月不可同时存在
(5)尽量使用全路径
四,可唤醒停机期间的工作任务
1,什么是 anacron?
anacron 不是用来取代 crontab 的,anacron 存在的目的是处理非 24 小时一直运行的 Linux 系统的crontab 执行,是以天为单位或者是在开机后立刻进行 anacron 的动作,它会去检查停机期间应该进行但是并没有进行的crontab 务,并将该任务执行一遍后,anacron 就会自动停止。
timestamps是anacron 读取的时间记录文件;anacron 会去分析现在的时间与时间记录文件记录的上次执行 anacron 的时间,两者比较后若发现有差异, 那就是在某些时刻没有进行 crontab !此时 anacron 就会开始执行未进行的crontab 任务了! 所以 anacron 其实也是透过 crontab 来运行的!因此 anacron 运作的时间通常有两个,一个是系统开机期间运行,一个是写入 crontab 的排程中。 这样才能够在特定时间分析系统未进行的 crontab 任务
2,anacron 与 /etc/anacrontab
anacron是一个程序并非一个服务,在CentOS中已经进入crontab中
# ll /etc/cron*/*ana*
-rwxr-xr-x 1 root root 379 Mar 28 2007 /etc/cron.daily/0anacron
-rwxr-xr-x 1 root root 381 Mar 28 2007 /etc/cron.monthly/0anacron
-rwxr-xr-x 1 root root 380 Mar 28 2007 /etc/cron.weekly/0anacron
# cat /etc/cron.daily/0anacron
#!/bin/sh
#
# anacron's cron script
#
# This script updates anacron time stamps. It is called through run-parts
# either by anacron itself or by cron.
#
# The script is called "0anacron" to assure that it will be executed
# _before_ all other scripts.
# Don't run anacron if this script is called by anacron.
if [ ! -e /var/run/anacron.pid ]; then
anacron -u cron.daily
fi
3,语法:
anacron [-sfn] [job]..
anacron -u [job]..
选项与参数:
-s :开始一连续的执行各项工作 (job),会依据时间记录文件的数据判断是否进行
-f :强制进行,而不去判断时间记录文件的时间戳;
-n :立刻进行未进行的任务,而不延迟 (delay) 等待时间;
-u :仅更新时间记录文件的时间戳,不进行任何工作。
job :由 /etc/anacrontab 定义的各项工作名称。
# /etc/anacrontab 内容
# cat /etc/anacrontab
# /etc/anacrontab: configuration file for anacron
# See anacron(8) and anacrontab(5) for details.
SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
1 65 cron.daily run-parts /etc/cron.daily
7 70 cron.weekly run-parts /etc/cron.weekly
30 75 cron.monthly run-parts /etc/cron.monthly
天数 延迟时间 工作名称定义 实际要执行的命令
# more /var/spool/anacron/*
::::::::::::::
/var/spool/anacron/cron.daily
::::::::::::::
20171206
::::::::::::::
/var/spool/anacron/cron.monthly
::::::::::::::
20171201
::::::::::::::
/var/spool/anacron/cron.weekly
::::::::::::::
20171203
3,工作流程
(1)由 /etc/anacrontab 分析到 cron.daily 这项工作名称的天数为 1 天;
(2)由 /var/spool/anacron/cron.daily 取出最近一次执行 anacron 的时间戳;
(3)由上个步骤不目前的时间比较,若差异天数为 1 天以上 ,就准备及进行执行;
(4)若准备进行执行,根据 /etc/anacrontab 的设置,将延迟 65 分钟
(5)延迟时间过后,开始执行后续命令,也就是 run-parts /etc/cron.daily;
(6)执行完毕后, anacron 程序结束
保证anacron开机进行
chkconfig --list anacron