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

相关推荐

  • N25-第二周做业

    一.Linux上的文件管理类命令都有哪些,其常用的使用方法和演示        1.目录管理的命令    mkdir rmdir              1)…

    Linux干货 2016-12-11
  • samba服务部署WordPress

    简介 Samba是一个能让Linux系统应用Microsoft网络通讯协议的软件,而SMB是Server Message Block的缩写,即为服务器消息块 ,SMB主要是作为Microsoft的网络通讯协议,后来Samba将SMB通信协议应用到了Linux系统上,就形成了现在的Samba软件。后来微软又把 SMB 改名为 CIFS(Common Inter…

    Linux干货 2017-04-28
  • 磁盘阵列(RAID)简介

    资料 RAID(Redundant Arrays of Inexpensive Disks 廉价磁盘冗余阵列)即磁盘阵列,磁盘阵列是由多个价格比较便宜的磁盘组合成的一个容量巨大的磁盘组,其原理是利用数组方式来制作磁盘组,配合数据分散排列的设计,配合数据分散排列的设计,提升数据的安全性。它把数据分别存放在多个硬盘上,输入输出操作能以平衡的方式交叠,改良性能,因…

    Linux干货 2017-04-17
  • OpenSSL

    OpenSSL由三部分组成:             libencrypto库             libssl库 …

    Linux干货 2017-05-30
  • 计算机基础知识

    计算机系统 计算机系统组成的两大部分 硬件系统     主机         中央处理器CPU{运算器,控制器}         内存储器{ROM,RAM} &…

    Linux干货 2016-08-04
  • N21沉舟第九周作业

    1、写一个脚本,判断当前系统上所有用户的shell是否为可登录shell(即用户的shell不是/sbin/nologin);分别这两类用户的个数;通过字符串比较来实现; 方法一: #!/bin/bash         #     dec…

    Linux干货 2016-08-30