二十六、定时任务

king's blog
我们都知道windows下可以设置定时任务,比如定时关机,那linux下该如何设置呢?好,那本节我们来了解下Linux中,关于定时任务的话题,主要内容如下:
一、设置单次定时任务
1、at
2、batch
二、设置循环定时任务
1、crontab
2、anacron

一、设置单次定时任务

定时任务可以是只运行一次的,也有循环运行的,我们先来看看单次的定时任务,通常用到的是at和batch命令,下面我们分别介绍

1、at

命令格式:
at [参数] 时间

常用参数:
-l :查询at任务列表,与atq命令作用一样
-v :显示即将被执行的任务时间
-d 任务编号 :删除at任务,与atrm命令作用一样
-r 任务编号 :与-d作用一样
-c 任务编号 :查看具体的任务内容
-f file :表示读取file中的内容作为任务内容

时间格式:
now + 1 minutes
23:00 2016-11-17

例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#1.1分钟之后创建/opt/project/test_1
ETS157:~ # at now + 1 minutes
warning: commands will be executed using /bin/sh
at> mkdir /opt/project/test_1 #--------->具体的任务内容
at> <EOT> #----------------------------->按Ctrl+d表示结束
job 11 at 2017-03-22 14:16

#2.2分钟之后创建/opt/project/test_2
ETS157:~ # at now + 1 minutes
warning: commands will be executed using /bin/sh
at> mkdir /opt/project/test_2 #--------->具体的任务内容
at> <EOT> #----------------------------->按Ctrl+d表示结束
job 12 at 2017-03-22 14:17

#3.查询at任务列表
ETS157:~ # at -l
12      2017-03-22 14:17 a root
11      2017-03-22 14:16 a root

#4.删除任务编号=11的任务,并查看删除后的任务列表
ETS157:~ # at -d 11
ETS157:~ # at -l
12      2017-03-22 14:17 a root

#5.查看任务编号=12任务的具体内容
ETS157:/opt/project # at -c 12
#!/bin/sh
# atrun uid=0 gid=0
# mail weblogic 0
umask 22
LESSKEY=/etc/lesskey.bin; export LESSKEY
NNTPSERVER=news; export NNTPSERVER
INFODIR=/usr/local/info:/usr/share/info:/usr/info; export INFODIR
MANPATH=/usr/share/man:/usr/local/man; export MANPATH
HOSTNAME=ETS157; export HOSTNAME
XKEYSYMDB=/usr/share/X11/XKeysymDB; export XKEYSYMDB
HOST=ETS157; export HOST
PROFILEREAD=true; export PROFILEREAD
HISTSIZE=1000; export HISTSIZE
MORE=-sl; export MORE
USER=root; export USER
LS_COLORS=no=00:fi=00:di=01\;34:ln=00\;36:pi=40\;33:so=01\;35:do=01\;35:bd=40\;33\;01:cd=40\;33\;01:or=41\;33\;01:ex=00\;32:\*.cmd=00\;32:\*.exe=01\;32:\*.com=01\;32:\*.bat=01\;32:\*.btm=01\;32:\*.dll=01\;32:\*.tar=00\;31:\*.tbz=00\;31:\*.tgz=00\;31:\*.rpm=00\;31:\*.deb=00\;31:\*.arj=00\;31:\*.taz=00\;31:\*.lzh=00\;31:\*.lzma=00\;31:\*.zip=00\;31:\*.zoo=00\;31:\*.z=00\;31:\*.Z=00\;31:\*.gz=00\;31:\*.bz2=00\;31:\*.tb2=00\;31:\*.tz2=00\;31:\*.tbz2=00\;31:\*.avi=01\;35:\*.bmp=01\;35:\*.fli=01\;35:\*.gif=01\;35:\*.jpg=01\;35:\*.jpeg=01\;35:\*.mng=01\;35:\*.mov=01\;35:\*.mpg=01\;35:\*.pcx=01\;35:\*.pbm=01\;35:\*.pgm=01\;35:\*.png=01\;35:\*.ppm=01\;35:\*.tga=01\;35:\*.tif=01\;35:\*.xbm=01\;35:\*.xpm=01\;35:\*.dl=01\;35:\*.gl=01\;35:\*.wmv=01\;35:\*.aiff=00\;32:\*.au=00\;32:\*.mid=00\;32:\*.mp3=00\;32:\*.ogg=00\;32:\*.voc=00\;32:\*.wav=00\;32:; export LS_COLORS
XNLSPATH=/usr/share/X11/nls; export XNLSPATH
ENV=/etc/bash.bashrc; export ENV
HOSTTYPE=x86_64; export HOSTTYPE
FROM_HEADER=; export FROM_HEADER
PAGER=less; export PAGER
CSHEDIT=emacs; export CSHEDIT
XDG_CONFIG_DIRS=/etc/xdg; export XDG_CONFIG_DIRS
MINICOM=-c\ on; export MINICOM
MAIL=/var/spool/mail/root; export MAIL
PATH=/sbin:/usr/sbin:/usr/local/sbin:/root/bin:/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/X11R6/bin:/usr/games:/opt/kde3/bin:/usr/lib/mit/bin:/usr/lib/mit/sbin:/opt/project/jdk1.6.0_38/bin; export PATH
CPU=x86_64; export CPU
INPUTRC=/etc/inputrc; export INPUTRC
PWD=/root; export PWD
JAVA_HOME=/opt/project/jdk1.6.0_38; export JAVA_HOME
LANG=POSIX; export LANG
PYTHONSTARTUP=/etc/pythonstart; export PYTHONSTARTUP
QT_SYSTEM_DIR=/usr/share/desktop-data; export QT_SYSTEM_DIR
SHLVL=1; export SHLVL
HOME=/root; export HOME
LESS_ADVANCED_PREPROCESSOR=no; export LESS_ADVANCED_PREPROCESSOR
OSTYPE=linux; export OSTYPE
LS_OPTIONS=-A\ -N\ --color=tty\ -T\ 0; export LS_OPTIONS
XCURSOR_THEME=DMZ; export XCURSOR_THEME
WINDOWMANAGER=/usr/bin/gnome; export WINDOWMANAGER
LESS=-M\ -I; export LESS
MACHTYPE=x86_64-suse-linux; export MACHTYPE
LOGNAME=root; export LOGNAME
XDG_DATA_DIRS=/usr/share:/etc/opt/kde3/share:/opt/kde3/share; export XDG_DATA_DIRS
LC_CTYPE=en_US.UTF-8; export LC_CTYPE
LESSOPEN=lessopen.sh\ %s; export LESSOPEN
INFOPATH=/usr/local/info:/usr/share/info:/usr/info; export INFOPATH
LESSCLOSE=lessclose.sh\ %s\ %s; export LESSCLOSE
G_BROKEN_FILENAMES=1; export G_BROKEN_FILENAMES
COLORTERM=1; export COLORTERM
cd /root || {
         echo 'Execution directory inaccessible' >&2
         exit 1
}
mkdir /opt/project/test_2

需要注意的是,不是任何用户都可以执行at命令,具体哪些用户可以,是根据/etc/at.allow和/etc/a.deny这两个文件确定的,具体逻辑如下:
1、如果存在/etc/at.allow文件,则该文件里的用户可使用at命令;如果没有,则判断/etc/at.deny文件是否存在,如果存在则表示该除该文件里的用户,都可以使用at命令;
2、如果这两个文件都不存在,则只有root用户才能使用at命令

2、batch

batch与at命令格式,包括时间格式基本一样,唯一不同的是at是按指定的时间准时执行,但batch则是根据系统的负载来确定是否准时执行,准确来说,但执行时刻,只有但负载<0.8时,才执行,否则延缓执行直到负载<0.8

二、设置循环定时任务

如果需要设置循环定时任务,用到的命令就是大名鼎鼎的crontab,与at命令一样,系统也是有用户限制的,如下:
1./etc/cron.allow文件中存在的用户,表示可使用crontab命令
2./etc/cron.deny文件中存在的用户,表示不能使用crontab命令
3./etc/cron.allow优先级高于/etc/cron.deny,通常情况下系统只保留/etc/cron.deny文件

1、crontab

用crontab创建了定时任务后,系统会根据执行用户在/var/spool/cron/tab目录下创建对应的任务文件,比如

1
2
3
4
ETS157:/var/spool/cron/tabs # ll
total 8
-rw-r--r-- 1 root root     639 Nov  3  2014 root
-rw-r--r-- 1 root wasgroup 621 Nov  8 11:26 weblogic

1.1 命令格式:
设定crontab任务:crontab [-u username] JobFile
其中,JobFile是具体的任务内容,格式我们后面再谈

设定crontab任务之后,我们可通过crontab -ler对任务进行查看编辑等,具体如下:
crontab -ler
-l:表示显示crontab的工作内容
-e:表示编辑crontab的工作内容
-r:表示移除所有的crontab的工作内容

1.2 JobFile文件格式
JobFile是由6个域组成,每个域以空格隔开,每个域名代表的含义如下:
第1个域:代表分钟,取值范围为:0-59
第2个域:代表小时,取值范围为:0-23
第3个域:代表日期,取值范围为:1-31
第4个域:代表月份,取值范围为:1-12
第5个域:代表周,取值范围为:0-7,其中0和7都代表周日,1代表周一等
第6个域:代表下达的指令,也可是shell script

同时每个域可使用如下的特殊符号:
* : 代表任何时刻都接受的意思
, : 代表分割时段的意思,比如是1,5,10分钟执行,则表示为1,5,10 * * * * command
– : 代表一段时间范围内,比如9点15点的30分执行,则表示为30 9-15 * * * command
/n: 代表每隔n个单位时间,比如每隔10分钟,这表示为*/10 * * * * command 或0-59/10 * * * * command

同时(月,周)不能同时存在,(日,周)也不能同时存在,因为两者之间有可能有冲突,比如执行11月,20周,系统是不知道具体的时间

例子:

1
2
3
4
5
6
#FileJob内容如下:
#run CE SchedMsgGen
1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31,33,35,37,39,41,43,45,47,49,51,53,55,57,59 8-19 * * * /opt/project/server/scripts/ce/runCE.sh SchedMsgGen >> /opt/project/server/scripts/ce/log/CE-SchedMsgGen.log 2>&1

#run CE Swf
2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42,44,46,48,50,52,54,56,58 8-19 * * * /opt/project/server/scripts/ce/runCE.sh Swf >> /opt/project/server/scripts/ce/log/CE-Swf.log 2>&1

以上例子含义如下:
表示每天8~23点的1分钟开始,每隔2分钟执行一次runCe.sh SchedMsgGen脚本;
每天的8~17点的10分钟开始,每隔10分钟执行一次runCE.sh Swf,也可以换种写法 1-59/5 8-23 * * * …..

1.3 crontab的配置说明
前面提到的crontab -e是针对使用者来设计的,需要自己去编写jobfile;但如果是系统任务,则crontab程序对应的配置文件是/etc/crontab,换句话说,系统任务的jobfile就是/etc/crontab,只需编辑该文件即可,该crontab是每隔1分钟会去检查/etc/crontab文件。因此,只要编辑完/etc/crontab,并保存后,cron的设定就自动的会被执行(有些系统,由于crontab是读到内存中的,所以修改完/etc/crontab之后,并不会马上被执行,需要重启crond服务,命令:/etc/init.d/cron restart (suse)

/etc/crontab文件内容如下:

1
2
3
4
5
6
7
SHELL=/bin/sh #----------------------------------------->表示使用哪种shell
PATH=/usr/bin:/usr/sbin:/sbin:/bin:/usr/lib/news/bin #-->表示文件搜索路径
MAILTO=root #------------------------------------------->表示该任务有错误或者有输出时,将已邮件的形式发给谁,可以将root修改为具体的邮箱地址
#
# check scripts in cron.hourly, cron.daily, cron.weekly, and cron.monthly
#
-*/15 * * * *   root  test -x /usr/lib/cron/run-crons && /usr/lib/cron/run-crons >/dev/null 2>&1

例子:

1
 
2、anacron

通常情况下,crontab是在主机一直开启的状态下,循环执行特定的任务,但如果主机关机了,该执行的任务则不会被执行;解决办法是用anacron命令,会在主机启动时,检查是否有该执行的命令没有执行,则重新执行一遍,anacron通常也是一个系统任务,配置文件是/etc/anacrontab,与/etc/crontab类似。而且anacron通常也是随开机一起启动的(可通过chkconfig –list命令去查看),换句话说,如果我们隔几天才开机,当开机后系统会自动运行anacron,不用人工去检查

格式如下:
anacron [-sfn] job

常用参数说明:
-s : 连续执行job工作,会依据时间记录文件的数据判断是否进行
-f : 强制进行,而不用去判断时间记录文件的时间戳
-n : now的意思,也就是立刻进行未进行的任务,而不是延迟等待时间
-u : 仅更新时间记录文件的时间戳,不进行任何工作
job: 指的是由/etc/anacrontab定义的各项工作名称

/etc/anacrontab文件内容
前面提到crontab对应的系统配置文件是/etc/crontab, 同样anacrontab对应的系统配置文件是/etc/anacrontab,结构如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#Redhat6.5, /etc/anacrontab文件内容
[root@ReapsCindaQA1 ~]# vi /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
# the maximal random delay added to the base delay of the jobs
RANDOM_DELAY=45
# the jobs will be started during the following hours only
START_HOURS_RANGE=3-22

#period in days   delay in minutes   job-identifier   command
1       5       cron.daily              nice run-parts /etc/cron.daily
7       25      cron.weekly             nice run-parts /etc/cron.weekly
@monthly 45     cron.monthly            nice run-parts /etc/cron.monthly

其中1 5 cron.daily nice run-parts /etc/cron.daily 4个字段含义如下
1:表示天数
5:代表延迟时间,单位为分钟
cron.daily :代表工作名称,名称任意
nice run-parts /etc/cron.daily : 代表指令串,也就是要执行的内容
同时/etc/cron.daily对应的时间戳文件是/var/spool/anacron/cron.daily
/etc/cron.monthly对应的时间戳文件是/var/spool/anacron/cron.monthly
/etc/cron.weekly对应的时间戳文件是/var/spool/anacron/cron.weekly

anacron的运行逻辑:
1. 由/etc/anacrontab分析到cron.daily这项工作名称的天数为 1 天;
2. 由/var/spool/anacron/cron.daily 取出最近一次执行anacron的时间戳;
3. 由上个步骤与目前时间比较,若差异天数为1天以上(含1天),也就是相差1天以内的则执行/etc/cron.daily,7年以内执行/etc/cron.weekly等等;
4. 若准备进行指令,根据/etc/anacrontab的设定,将延迟5分钟,也就是开机后5分钟开始执行
5. 延迟时间过后,开始执行后续指令,即『 run-parts /etc/cron.daily 』这串指令;
6. 执行完毕后,anacron程序结束

附:各个时间戳文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[root@ReapsCindaQA1 anacron]# more /var/spool/anacron/*
::::::::::::::
/var/spool/anacron/cron.daily
::::::::::::::
20170327


::::::::::::::
/var/spool/anacron/cron.monthly
::::::::::::::
20170317


::::::::::::::
/var/spool/anacron/cron.weekly
::::::::::::::
20170324
Tags:
文 / 甲乙丙丁
LEAVE A REPLY

loading