Linux计划任务详解

来源:互联网 发布:php技术文档 编辑:程序博客网 时间:2024/06/06 19:21

一、仅执行一次的工作调度

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+10minat> ls /etcat> <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 -l8   Sun Apr 23 21:53:00 2017 a root9   Sun Apr 23 21:58:00 2017 a root[root@localhost ~]# atq8   Sun Apr 23 21:53:00 2017 a root9   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 /etcat> <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/bashPATH=/sbin:/bin:/usr/sbin:/usr/binMAILTO=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.d0hourly  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 jobsSHELL=/bin/bashPATH=/sbin:/bin:/usr/sbin:/usr/binMAILTO=root01 * * * * 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
0 0