返回 登录
1

Linux计划任务详解

阅读267

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

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
评论