例行性工作 排程(crontab)-阿里云开发者社区

开发者社区> 开发与运维> 正文

例行性工作 排程(crontab)

简介:

一,什么是例行性工作排程?

计划任务:比如每天,每周,每月,每年或者指定时间需要执行的工作任务

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











本文转自 wpf926 51CTO博客,原文链接:http://blog.51cto.com/wupengfei/2048148,如需转载请自行联系原作者

版权声明:本文首发在云栖社区,遵循云栖社区版权声明:本文内容由互联网用户自发贡献,版权归用户作者所有,云栖社区不为本文内容承担相关法律责任。云栖社区已升级为阿里云开发者社区。如果您发现本文中有涉嫌抄袭的内容,欢迎发送邮件至:developer2020@service.aliyun.com 进行举报,并提供相关证据,一经查实,阿里云开发者社区将协助删除涉嫌侵权内容。

分享:
开发与运维
使用钉钉扫一扫加入圈子
+ 订阅

集结各类场景实战经验,助你开发运维畅行无忧

其他文章