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 09:37
下一篇 2017-10-27 09:42

相关推荐

  • 配置使用基于mysql存储rsyslog日志信息

    配置使用基于mysql存储rsyslog日志信息   日志对于我们来说,肯定不会陌生。每个系统应用,只要有人访问,每时每刻都会产生大量的日志,用来记录服务器应用的运行信息。以便于我们在服务有异常时进行查看,或是从日志记录中提取出应用系统的运行信息。某些电商Web网站甚至会利用日志记录去对用户的购买行为作分析,以便更好的服务于客户。 &nb…

    Linux干货 2016-09-05
  • Linux基础目录名称命名法则及功能规定

    Linux中有非常多的目录文件,那么这些目录文件的命令规则,和功能都有那些,今天学习了下,下面是我的学习记录,跟大家分享下。 文件命名规则 (1) 除了/之外,所有字符都合法 (2) 特殊字符如@、#、¥、&、()、-、空格等最好不要使用,当使用空格作为文件名时,执行命令会出错 (3) 避免使用”.”作为文件名的第一个字符,因为在Linux系统中以”…

    Linux干货 2016-08-15
  • 干货 | 20 行 Python 代码创建可视化地图

    当我开始建造Vincent时, 我的一个目的就是使得地图的建造尽可能合理化. 有一些很棒的python地图库-参见Basemap 和 Kartograph能让地图更有意思. 我强烈推荐这两个工具, 因为他们都很好用而且很强大. 我想有更简单一些的工具,能依靠Vega的力量并且允许简单的语法点到geoJSON文件,详细描述一个投影和大小/比列,最后输出地图. …

    2017-09-08
  • Linux 基础知识(六.二)

    1、复制/etc/rc.d/rc.sysinit至/tmp目录,将/tmp/rc.sysinit文件中的以至少一个空白字符开头的行的行首加# [root@server01 tmp]# cp /etc/rc.d/rc.sysinit /tmp/ [root@server01 tmp]# sed -n "s@^[[:space:]]\+@#&@…

    Linux干货 2016-11-14
  • N25_第二周作业

      1、Linux上的文件管理命令都有哪些,其常用的使用方法及其相关示例演示。  cp命令:                                  &nbsp…

    Linux干货 2016-12-13
  • Linux基础之权限管理(含SUID\SGID\STICKY和ACL)

    概述     Linux系统是一个多人多任务的操作系统,系统上同时可能有很多人登录,每个人都会利用系统上的各类资源完成一定的操作。那么如何合理的规范这些用户的行为,保证资源的合理分配,则就需要用到权限管理的相关内容了。权限管理是Linux系统上最基础,也是最重要的一部分内容,本章就简要说明下权限管理的相关内容。内容主要…

    Linux干货 2016-08-04