一、仅执行一次的工作调度
1. at命令介绍
语法:at [OPTION]... TIME
常用选项:
- -l:查看作业队列,相当于atq;
- f /PATN/FROM/SOMEFILE:从指定文件中读取作业任务,而不用再交互输入;
- -d:删除指定的作业,相当于atrm;
- -q QUEUE:指明队列
设置任务运行时间的格式:
- HH:MM [[CC]YY-mm-dd]
- noon, midnight , teatime (4pm)
- now+#{ min | hours | days | weeks }
使用交互式方式创建一个任务:
[root@localhost ~]# at now+10min
at> ls /etc
at> <EOT> #Ctrl+d结束输入
job 8 at Sun Apr 23 21:53:00 2017
使用指定文件作为输入:
[root@localhost ~]# at -f ~/scripts/sleep500s.sh now+10min
job 9 at Sun Apr 23 21:58:00 2017
查看任务队列:
[root@localhost ~]# at -l
8 Sun Apr 23 21:53:00 2017 a root
9 Sun Apr 23 21:58:00 2017 a root
[root@localhost ~]# atq
8 Sun Apr 23 21:53:00 2017 a root
9 Sun Apr 23 21:58:00 2017 a root
删除指定任务:
[root@localhost ~]# at -d 8
[root@localhost ~]# atrm 9
2. batch命令介绍
batch命令其实是一个脚本文件。batch会让系统自行选择在系统资源较空闲的时间去执行指定的任务,其用法也很简单,没有任何参数。使用如下:
[root@localhost ~]# batch
at> ls /etc
at> <EOT>
job 12 at Sun Apr 23 21:58:00 2017
二、周期性任务计划
1. crond守护进程的启用
有时候,我们需要系统执行一些周期性的任务,比如说,定期备份、定期清理临时文件等操作。Linux系统通过crond服务实现这一功能。CentOS上crond守护进程默认是有安装并开启了的。CentOS 5、6上可以使用 service crond status
查看crond是否正在运行,CentOS 7上可以使用 systemctl status crond.service
查看。
2. crond如何保存计划任务
crond需要使用/etc/crontab主配置文件和/etc/cron.d目录下的子配置文件来保存周期性任务,为了确保配置文件的格式不发生错误,要使用crontab命令编辑配置文件。
cron周期性任务分为系统级周期性任务和用户周期性任务。系统级周期性任务记录在/etc/crontab主配置文件和/etc/cron.d目录下的子配置文件中;用户周期性任务记录在/var/spool/cron目录下以各用户名命名的文件中。
3. cron周期性任务服务相关的配置文件
(1) /etc/cron.allow和/etc/cron.deny
/etc/cron.allow,存放被允许使用cron周期性任务的用户名单;/etc/cron.deny,存放不被允许使用cron周期性任务的用户名单。两个文件的格式都是将用户名填入文件中,每个用户名占一行。两个文件只生效一个,若/etc/cron.allow存在,生效之;否则,生效/etc/cron.deny。
(2) /etc/crontab文件 和 /etc/cron.d目录
/etc/crontab:
该文件是系统级cron任务的配置文件,主要用于实现系统自身的周期性自动维护。其配置文件的格式如下:
[root@localhost ~]# cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# 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
其中的SHELL定义了周期性任务使用的解释器;PATH为重新定义的命令路径环境变量;MAILTO定义了任务执行后的结果发送给哪个用户的邮箱。
在/etc/crontab文件中,每一行定义一个周期性任务,每行的各字段定义如下:
- * * * * *:五个星号,分别代表分钟、小时、天、月、星期,用于设定周期性任务的执行周期。当系统实现与这里设定的时间吻合时,该行周期性任务被执行。
- user-name:指定使用哪个用户身份执行该周期性任务。
- command to be executed:要执行的命令。
周期性任务时间的设定方式如下:
匹配范围 | 使用符号 |
---|---|
匹配任意时间值 | *:可以匹配任意整数 |
匹配指定时间值 | #:可以匹配任意给定的一个整数值 |
匹配离散时间值 | #,#…,#:可以匹配多个给定的整数值 |
匹配连续时间值 | #-#:可以匹配给定的某个区间内的所有整数值 |
固定时间间隔执行一次 | */#;可以匹配任意指定的时间间隔,但需能被#整除 |
使用示例: |周期性任务时间要求|配置文件中时间字段的值| |————|:————–:| |每小时任务;每小时的第3分钟执行一次|3 * * * * | |每周任务;每周五的4点3分执行一次|3 4 * * 5 | |每月任务;每月的7号的6点5分执行一次|5 6 7 * * | |每年任务;每年的10月9号8点7分执行一次|7 8 9 10 *| |每周三和周日执行一次|1 1 * * 3,5 | |每月6号至11号5点4分执行一次|4 5 6-11 * *| |每5分钟执行一次| \*/5 * * * * | **/etc/corn.d目录:** 为了方便管理系统级周期性任务,除了/etc/crontab文件作为配置系统级周期性任务的主配置文件外,我们还可以/etc/cron.d目录下创建多个子配置文件,分类的存放系统级周期性任务。子配置文件的格式和主配置文件格式相同。 我们可以根据周期任务的执行周期,或为哪些应用程序服务,进行分类,如下。
[root@localhost ~]# ls /etc/cron.d
0hourly raid-check sysstat unbound-anchor
(4) /etc/cron.hourly目录、/etc/cron.daily目录、/etc/cron.weekly目录和/etc/cron.monthly目录
/etc/cron.hourly目录、/etc/cron.daily目录和/etc/cron.monthly目录分别用于存放执行周期为小时、天、月的可执行文件,例如可执行脚本文件。我们在周期性任务配置文件中配置一行周期性任务 run-parts <directory>
,便能执行多个周期相同的任务了。(注:run-parts命令的使用在下一小节有加以介绍)
如/etc/cron.d/0hourly文件中,便以小时为周期执行/etc/hourly目录下的可执行文件,如下:
[root@localhost ~]# cat /etc/cron.d/0hourly
# Run the hourly jobs
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
01 * * * * root run-parts /etc/cron.hourly
(5) /var/spool/cron目录下以用户名命名的文件
每个用户定义的周期性任务,都存放在/var/spool/cron目录下以自己的名字命名的文件中。文件内容的格式与系统级周期性任务的配置文件/etc/crontab相似,但少了user-name字段,即格式示例如下:
[root@localhost ~]# cat /var/spool/cron/Kamin
* 19 * * * ls /
3. crontab命令提交用户周期性任务
通过对/var/spool/cron目录下配置文件的修改,来提交周期性任务。但为了避免使用vim编辑器编辑时,语法错误使得周期性任务无法执行,我们必须使用专用的、带有语法检查的工具crontab来提交任务。
语法:crontab [-u user] [-l | -r | -e] [-i] [-s]
选项:
- -u user:操作指定用户的周期性任务,只有root可以使用。
- -l:列出用户的周期性任务。
- -e:编辑用户的周期性任务配置文件。
- -r:清空用户的周期性任务。
- -i:在清空用户周期性任务时进行交互式的提醒。
三、run-parts的使用
run-parts命令其实是安装crond服务时生成的脚本文件,其作用是执行指定目录下的所有可执行文件,用法如下:
格式:run-parts [--list|--test]<directory>
选项:
- –list:列出指定目录下的所有文件,不包括子目录下的文件。
- –test:列出指定目录下的所有可执行文件,不包括子目录下的文件。
run-parts的使用示例:
列出/etc目录下的所有文件:
[root@localhost ~]# run-parts --list /etc
/etc/DIR_COLORS
/etc/DIR_COLORS.256color
...省略更多信息...
列出/etc目录下的所有可执行文件:
[root@localhost ~]# run-parts --test /etc
/etc/auto.net
/etc/auto.smb
执行./scripts目录下的所有文件(脚本test1.sh和test2.sh):
[root@localhost ~]# run-parts ./scripts/
./scripts/test1.sh:
This is a test scripts.
./scripts/test2.sh:
This is test2.sh