0.目录
1.单一任务调度at
在将来某特定时间执行操作,可使用at命令。
使用格式:at [options] TIME
,而后即可在交互界面输入可执行的操作,“ctrl + d”结束操作。
执行结果会发送至用户邮箱/var/spool/mail/USERNAME。
TIME的表示:
精确时间
精确写明执行时间。年月日可使用“-”“.”或“/”进行间隔,也可不使用间隔。[root@local ~]# at 22:30 2017-2-22 at> ls / # 到指定时间执行列出根目录各文件的操作 at> <EOT>
精确时间也可仅几时几分,表示下一个该时分执行操作。
相对时间
“now+时间段”表示相对现在经过的时间,时间段单位有miniutes(可简写为min)、hours、days、weeks等。[root@local ~]# at now+1min # 1分钟后执行操作 at> ls / at> <EOT>
- 模糊时间
使用日常用语表达时间,其实并不模糊。比如midnight表示0点,noon表示正午12点等。
at的常用选项:
选项“-l”,列出当前已提交过的任务(相当于命令atq)。
[root@local ~]# at -l 3 2017-02-22 22:30 a root
选项“-f”,读取文件中的指令作为任务的操作。
对于需频繁执行的操作,可事先写在文件中3,这样就不用频繁与at交互写入指令了。[root@local ~]# cat <<EOF > test_file ls / ls /tmp EOF [root@local ~]# at -f test_file now+1min job 6 at 2017-02-21 20:44
选项“-d”,撤销指定任务,参数为任务编号(相当于命令atrm)。
[root@local ~]# at -l 3 2017-02-22 22:30 a root [root@local ~]# at -d 3 [root@local ~]# at -l [root@local ~]#
- 选项“-c”,查看指定任务的内容及定义任务时的环境,参数为任务编号。
对于长时间后才执行的任务,为便于中途查看其内容,可使用此选项,且会列出定义该任务时的shell环境4。
环境变量过多,此处不再列出此选项的执行结果。 选项“-q”,指定任务所属队列。
[root@local ~]# at -q b now+1min at> echo hello at> <EOT> job 9 at 2017-02-21 21:11 [root@local ~]# at -l 9 2017-02-21 21:11 b root
2.周期性任务计划cron
对于需周期性执行的操作,比如数据备份等,可使用周期性任务计划。
周期性任务执行结果,也会发送至用户邮箱/var/spool/mail/USERNAME5。
2.1 所需服务
周期性任务计划,需要名为crond的服务(如没有需安装对应软件包)时刻监控是否有任务需执行。所以要确保该服务处于运行状态,否则定义的周期性任务计划不会执行。
[root@local ~]# service crond status
crond (pid 2009) is running...
2.2 系统cron
周期性任务计划(cron任务)分为两类:系统cron、用户cron。
二者的任务都需定义在配置文件中,且配置文件有固定格式。
系统cron主要用于系统自身的维护,配置文件为/etc/crond,如修改则需直接编辑,不过一般无需用户修改。
[root@local ~]# cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
# For details see man 4 crontabs
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
可以看到系统cron的配置文件,开头也定义了环境变量PATH,但明显少于常用路径。故定义是也需使用命令绝对路径或在执行的脚本中重新定义PATH。
2.3 用户cron
2.3.1 用户cron配置文件
用户cron的配置文件为/var/spool/cron/USERNAME。
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * command to be executed
文件格式与系统cron的配置文件相同,不过不用在定义时间后指明运行任务的user-name,因为定义者肯定是当前用户;也不用定义MAILTO,因为运行结果是发给定义任务的用户的。
每行定义一个周期任务,定义格式就是* * * * * command to be executed
。
其中“*”的位置用来定义周期性时间,共5字段,后跟需执行的操作6。
2.3.2 周期性时间表示
表示周期性时间的5个字段的意义依次为:分钟、小时、日、月、星期。最小单位是分钟,如想实现以秒计的时间周期,则只能通过执行的脚本的内容实现。
如果到了指定时间,由于关机等原因而导致任务没有按时执行的,不会补偿执行,只能等到下个周期时间再执行。
周期性时间有多种取值方式,以满足不同场景:
特定取值
在指定时间位置,写明具体数字。无需指定的,可使用“*”号,表示“每……”。比如每小时的第3分钟执行操作:
3 * * * * COMMAND
每年5月25日20点10分执行操作7:
10 20 25 5 * COMMAND
离散取值
多个特定取值,各特定值使用逗号隔开。比如每周三和周五,这两天的8点整和20点整,执行操作:
0 8,20 * * 3,5 COMMAND
连续取值
用于表示连续时间,使用“-”号。比如周一至周五,每天的9点至18点,期间的每个整点执行操作:
0 9-18 * * 1-5 COMMAND
定义步长
时间步长默认为1,若需改变指定位置的时间步长,使用“/”号。比如周一至周五,每天的9点至18点,期间每2分钟执行操作:
*/2 9-18 * * 1-5 COMMAND
注意,如果表示每7分钟执行操作,并不能简单地把上述的2改为7。因为60无法被7整除,56分钟后,再过4分钟又会重新开始执行,无法达到预期效果。类似功能只能通过执行的脚本内容的设定实现。
2.3.3 命令crontab
命令crontab用于管理用户cron。
常用选项:
- 选项“-e”,用于编辑用户cron配置文件。
实际就是调用了vi编辑用户配置文件/var/spool/cron/USERNAME。但不要直接使用编辑器编辑该文件,只有使用cron命令进行编辑时,系统会检查语法、格式是否错误。
对于需删除的周期任务,直接删除、或注释掉配置文件中对应的行即可。
配置文件/var/spool/cron/USERNAME编辑完成后,立即生效。 选项“-l”,列出当前用户的所有周期性任务。
比如添加一个整点报时的任务,再由此选项查看:[root@local ~]# crontab -l 0 * * * * echo "It's $(date +\%F\%t\%T)"
如上所示,cron配置文件中命令部分的“%”需要转义,否则将作为换行符,且第一个换行符后的内容将被作为标准输入的内容传递给命令。
选项“-r”,移除当前任务所有周期性任务。
实际是把当前用户对应的cron配置文件都删除了。- 选项“-u”,管理指定用户的cron配置文件。
与上述的“-e”连用为编辑;“-l”连用为列出等等。
显然只有root有此权限。
(完)
- 此处为3是因为此前已经设置过2个任务了,任务1、2执行完毕或被撤销后就不存在了。但任务编号采用的是绝对编号,1、2不存在了,任务3也仍然是3,且随后创建的任务会依次排序,也不会是1、2。 ↩
- 这里的队列是为了便于管理各任务。比如可把某用户的所有任务都置于同一队列下等等。用户可自行划分队列,如无设定,则默认所有任务都在队列a。 ↩
- 这里文件中的各指令各占一行即可,无需使用分号区隔。 ↩
- 定义任务时,其环境也被记录了,因为实际执行时并不一定满足这样的环境(比如到任务执行时间时,定义此任务的用户都没登录,环境肯定不同)。
也正因如此,任务中的指令要尽量使用绝对路径,而非只是命令名称。 ↩ - 对于执行较频繁、且能保证运行结果正确的周期性任务,可把其执行结果重定向至/dev/null。不过错误输出最好还是不要重定向,这样执行发生错误时还是能够发送给用户。 ↩
- 和at相同,到了执行的时间定义任务的用户未必登录(即环境改变),所以执行的命令尽量使用绝对路径,或在执行的脚本中重新定义环境。 ↩
10 20 25 5 1 COMMAND
表示每年5月25日(不论周几)20点10分,和每周一(不论日期)的20点10分,均执行操作。
即日期和星期如果同时使用,它们是互不干扰的。不过需要这样既指定日期,又指定星期几来执行操作的情况应该并不常见,不太符合人们表述时间的习惯。 ↩