Linux计划任务

Linux计划任务

## 一、定义
计划任务是通过计划编排的方式,让指定任务在未来的指定时间执行一次或按时间周期多次执行,并且能够通过系统内部邮件的方式通知指定用户执行的结果。

## 二、计划任务的分类
从执行的特点来看,计划任务分为:

类别 | 含义 | 命令
—— | —— | ——
单次执行 | 在未来的某时间点执行一次某任务 | at,batch
周期执行 | 周期性运行某任务,执行结果会通过邮件发送给用户 | crontab

## 三、邮件服务基础知识
本地电子邮件服务
**发邮件**
smtp:simple mail transmission protocol
**收邮件**
pop3/imap4:  Post Office Protocol / Internet Mail Access Protocol

MUA:Mail User Agent,用户收发邮件的工作程序
mailx [-s ‘SUBJECT’] username[@hostname]
邮件正文的生成方式:
1. 交互式输入
.单独成行表示正文结束;Ctrl+d提交亦可
2. 通过输入重定向
~]# mail -s ‘fstab file’ root < /etc/fstab
3. 通过管道
~]# cat /etc/fstab | mail -s ‘fstab file’

## 四、计划任务相关命令使用
### 1. 单次执行相关命令
**(1) at**
语法:at [OPTION]… TIME

TIME的表现形式:
a. HH:MM [YYYY-mm-dd]
b. noon(12:00),midnight(24:00),teatime(16:00)
c. tomorrow
d. now+#UNIT,UNIT:minutes, hours, days, weeks

at命令的选项

选项 | 含义
—— | ——
-l | 查看作业队列,相当于atq命令
-f /PATH/FROM/SOMEFILE | 从指定文件中读取作业任务,而不用再交互式输入
-d | 删除指定的作业,相当于atrm命令
-c # | 查看第#个作业的具体内容
-q QUEUE | 指明队列

> 注意:
作业执行的结果是以邮件发送给提交作业的用户;
at命令可以执行shell脚本,可以直接指定脚本文件路径;
at命令有自己的运行环境,与交互式界面的运行环境不相同,有时执行命令需要指明命令的绝对路径,否则未必能够找到命令。

**(2) batch**
batch命令会让系统自行选择在系统资源比较空闲的时间去执行指定的任务

### 2. 周期执行相关命令
#### (1) cron
服务程序:
cronle:主程序包,提供了crond守护进程及相关辅助工具。

任务调度的crond常驻命令
crond 是linux用来定期执行程序的命令。当安装完成操作系统之后,默认便会启动此任务调度命令。crond命令每分锺会定期检查是否有要执行的工作,如果有要执行的工作便会自动执行该工作。

**cron的服务管理**

命令 | 含义
—— | ——
/sbin/service crond start | 启动服务
/sbin/service crond stop | 关闭服务
/sbin/service crond restart | 重启服务
/sbin/service crond reload | 重新载入配置
你也可以将这个服务在系统启动的时候自动启动:
在/etc/rc.d/rc.local这个脚本的末尾加上:
/sbin/service crond start

**linux任务调度的工作主要分为以下两类**:
系统执行的工作:系统周期性所要执行的工作,如备份系统数据、清理缓存
> 对于系统cron任务,要修改的话,需要手动编辑/etc/crontab配置文件

个人执行的工作:某个用户定期要做的工作,例如每隔10分钟检查邮件服务器是否有新信,这些工作可由每个用户自行设置。

**系统cron的配置格式 –  /etc/crontab**

“`
~]# 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
“`
> 注意
1.每一行定义一个周期性任务,共7个字段:
\* * * * * : 定义周期性时间
user-name:运行任务的用户的身份
command 通杯executed:要运行的任务
2.此处的环境变量不同于用户登陆后获得的环境变量,因此建议命令使用绝对路径(或自定义环境变量)以避免出现问题。
3.执行结果邮件发送给MAILTO指定的用户

 

**用户cron的配置格式 – /var/spool/cron/USERNAME**
“`
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
# |  |  |  |  |
# *  *  *  *  * command to be executed
“`
> 注意
1.每一行定义一个周期性任务,共6个字段:
\* * * * * : 定义周期性时间
command 通杯executed:要运行的任务
2.此处的环境变量不同于用户登陆后获得的环境变量,因此建议命令使用绝对路径(或自定义环境变量)以避免出现问题。
3.执行结果邮件发送给当前用户

**cron文件语法**
分     小时   日       月       星期     命令
0-59   0-23   1-31   1-12     0-6     command     (取值范围,0表示周日一般一行对应一个任务)

几个特殊符号的含义:

符号 | 含义
—— | ——
* | 代表取值范围内的数字,
/ | 代表”每”,
– | 代表从某个数字到某个数字,
, | 分开几个离散的数字

 

– **任务调度设置文件的写法**
可用crontab -e命令来编辑,编辑的是/var/spool/cron下对应用户的cron文件,也可以直接修改/etc/crontab文件

具体格式如下:
Minute Hour Day Month Dayofweek   command
分钟     小时   天     月       每星期的第几天       命令

每个字段代表的含义如下:

段 | 含义
— | ——
Minute |  每个小时的第几分钟执行该任务
Hour | 每天的第几个小时执行该任务
Day | 每月的第几天执行该任务
Month | 每年的第几个月执行该任务
DayOfWeek | 每周的第几天执行该任务
Command | 指定要执行的程序

在这些字段里,除了“Command”是每次都必须指定的字段以外,其它字段皆为可选字段,可视需要决定。对于不指定的字段,要用“*”来填补其位置。
例如:
5       *       *           *     *     ls             指定每小时的第5分钟执行一次ls命令
30     5       *           *     *     ls             指定每天的 5:30 执行ls命令
30     7       8         *     *     ls             指定每月8号的7:30分执行ls命令
30     5       8         6     *     ls             指定每年的6月8日5:30执行ls命令
30     6       *           *     0     ls             指定每星期日的6:30执行ls命令 [注:0表示星期天,1表示星期1,以此类推,也可以用英文来表示,sun表示星期天,mon表示星期一等。]
30     3     10,20     *     *     ls     每月10号及20号的3:30执行ls命令 [注:“,”用来连接多个不连续的时段]
25     8-11 *           *     *     ls       每天8-11点的第25分钟执行ls命令 [注:“-”用来连接连续的时段]
*/15   *       *           *     *     ls         每15分钟执行一次ls命令 [即每个小时的第0 15 30 45 60分钟执行ls命令 ]
30   6     */10         *     *     ls       每个月中,每隔10天6:30执行一次ls命令[即每月的1、11、21、31日是的6:30执行一次ls命令。 ]
每天7:50以root 身份执行/etc/cron.daily目录中的所有可执行文件
50   7       *             *     *     root     run-parts     /etc/cron.daily   [ 注:run-parts参数表示,执行后面目录中的所有可执行文件。 ]

– **新增调度任务**
新增调度任务可用两种方法:
1、在命令行输入: crontab -e 然后添加相应的任务,wq存盘退出。
2、直接编辑/etc/crontab 文件,即vi /etc/crontab,添加相应的任务。
– **查看调度任务**
crontab -l //列出当前的所有调度任务
crontab -l -u jp   //列出用户jp的所有调度任务
– **删除任务调度工作**
crontab -r   //删除所有任务调度工作
– **任务调度执行结果的转向**
例1:每天5:30执行ls命令,并把结果输出到/jp/test文件中
30 5 * * * ls >/jp/test 2>&1
注:2>&1 表示执行结果及错误信息。
编辑/etc/crontab 文件配置cron
cron服务每分钟不仅要读一次/var/spool/cron内的所有文件,还需要读一次/etc/crontab,因此我们配置这个文件也能运用cron服务做一些事情。用crontab配置是针对某个用户的,而编辑/etc/crontab是针对系统的任务。此文件的文件格式是:
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root //如果出现错误,或者有数据输出,数据作为邮件发给这个帐号
HOME=/ //使用者运行的路径,这里是根目录
# run-parts
01   *   *   *   *     root run-parts /etc/cron.hourly         //每小时执行/etc/cron.hourly内的脚本
02   4   *   *   *     root run-parts /etc/cron.daily           //每天执行/etc/cron.daily内的脚本
22   4   *   *   0     root run-parts /etc/cron.weekly       //每星期执行/etc/cron.weekly内的脚本
42   4   1   *   *     root run-parts /etc/cron.monthly     //每月去执行/etc/cron.monthly内的脚本
大家注意”run-parts”这个参数了,如果去掉这个参数的话,后面就可以写要运行的某个脚本名,而不是文件夹名了
例如:         1、在命令行输入: crontab -e 然后添加相应的任务,wq存盘退出。
2、直接编辑/etc/crontab 文件,即vi /etc/crontab,添加相应的任务
11 2 21 10 * rm -rf /mnt/fb

**crontab命令的常用参数**

参数 | 含义
—— | ——
-u | 设定某个用户的cron服务,一般root用户在执行这个命令的时候需要此参数
-l | 列出某个用户cron服务的详细内容
-r | 删除没个用户的cron服务
-i | 与-r一同使用,可以在删除前提醒用户确认是否删除
-e | 编辑某个用户的cron服务
示例:
root查看自己的cron设置
`crontab -u root -l`
root想删除fred的cron设置
`crontab -u fred -r`
> 注意
运行结果以邮件的形式通知当前用户,如果不想收到邮件:
(1) 正确信息不发邮件: COMMAND > /dev/null
(2) 正确错误都不发邮件:COMMAND &> /dev/null
另外,
定义COMMAND时,如果命令需要用到%,需要对其转义;但放置于单引号中的%不用转义亦可。

思考:某任务在指定的时间点因关机未能执行,下一次开机会不会自动执行?
答:不会执行,只能等待下一个周期的出发时间点再执行。
如果期望某时间因故未能按时执行,下一次开机后,无论是否到错过运行时间点都要执行一次,可使用anacron实现。

## 五、练习题
1. 每12小时备份一次/etc/目录至/backups目录中,保存文件名称格式为“etc-yyyy-mm-dd-hh.tar.xz”
“`
~]# vim etc_backup.sh
#!/bin/bash
#
[ ls /backups &> /dev/null ] || mkdir /backups &> /dev/null
tar -Jcf /backups/etc-$(date +%F-%H-%m-%d).tar.xz /etc/* &> /dev/null

crontab -e
0 0,12 * * * /root/etc_backup.sh
“`

2. 每周2、4、7备份/var/log/secure文件至/logs目录中,文件格式为“secure-yyyymmdd”
“`
~]# crontab -e
0 0 * * 2.4.7 cp /var/log/secure /logs/secure-$(date +%Y%m%d)
“`
3. 每2小时取出当前系统/proc/meminfo文件中以S或M开头的行信息,追加至/tmp/meminfo.txt文件中
“`
~]# crontab -e
0 */2 * * * grep “^[SM].*” /proc/meminfo > /tmp/meminfo.txt

“`

本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:http://www.178linux.com/88074

(0)
N27_sapbcsN27_sapbcs
上一篇 2017-10-27
下一篇 2017-10-27

相关推荐

  • FHS文件系统各目录功能

        FHS文件系统各目录功能 前言                  FHS (Files system Hiserarchy Standard)…

    Linux干货 2016-10-17
  • bash特性

    2018-03-11

    2018-03-11
  • liunx初探

    计算机的五大单元: 输出单元、输入单元、cpu内部控制单元、算术逻辑单元和内存。 计算机三大组成部分: 输入单元:键盘、鼠标等等 输出单元:屏幕、打印机等 中央处理器(CPU):含有算术逻辑、控制、记忆等 CPU种类有两种分别是:   精简指令集(RISC):这种cpu微指令比较精简,每个指令的执行时间都很短,完成的操作也很简单。常见的简单指令集C…

    Linux干货 2016-09-14
  • Linux任务计划,周期性任务执行详解

    Linux任务计划,周期性任务执行 概述 本章将为大家介绍一些任务计划和周期性任务计划执行相关内容任务计划的分类主要有由两种    未来的某时间点执行一次某任务:at,batch    周期性运行某任务:crontab具体分为三个方面来说明:    1、at计划任务    2、c…

    Linux干货 2016-09-27
  • Iptables基础

       Firewall:防火墙,工作于主机或网络的边缘处,对于进出本主机或网络的报文根据事先定义好的检查规则左匹配检测,对于能够被规则所匹配到的报文进行相应的处理的组件。   防火墙可分为:硬件防火墙,在硬件级别实现部分功能的防火墙;软件防火墙,应用软件处理逻辑运行于通用硬件平台之上的防火墙;主机防火墙,服务范围为当前主机;网络…

    2017-06-19
  • Ansible应用介绍

    Ansible 简介 ansible是个什么东西呢?官方的title是“Ansible is Simple IT Automation”——简单的自动化IT工具。这个工具的目标有这么几项:自动化部署APP;自动化管理配置项;自动化的持续交互;自动化的(AWS)云服务管理。所有的这几个目标从本质上来说都是在一个台或者几台服务器上,执行一系列的命令而已。通俗的说…

    Linux干货 2015-07-03