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

相关推荐

  • 管理systemd

    管理systemd init(系统的第一个进程): CentOS 5: SysV initCentOS 6: UpstartCentOS 7: Systemd Systemd:系统启动和服务器守护进程管理器,负责在系统启动或运行时,激活系统资源,服务器进程和其它进程 Systemd新特性: 系统引导时实现服务并行启动 按需启动守护进程 系统状态快照 自动化的…

    Linux干货 2016-09-22
  • 01Linux的发展历史

    1、1965年时,贝尔实验室(Bell Labs)加入一项由通用电气(General Electric)和麻省理工学院(MIT)合作的项目;该项目要建立一套多使用者、多任务、多层次(multi-user、multi-task、multi-level)的MULTICS操作系统。但是由于整个目标过于庞大,糅合了太多的特性,Multics虽然发布了一些产品,但是性…

    Linux干货 2016-10-14
  • M22 程序员偷懒战法

    前段时间有个外国的程序猿走红网络,这个哥们可以说是懒到了极点,上班请假给领导发短信写脚本,下班晚回家给老婆发短信写脚本,甚至于接个咖啡也要写脚本。这个哥们离职之后,他的同事在他的办公电脑上发现了这些脚本,并公布到了网上,引起众程序猿纷纷膜拜。最近我刚好学到shell脚本部分,就让我分析其中的一个跟领导请假的脚本吧。 #!/bin/sh -e # Exit e…

    Linux干货 2017-04-06
  • 我的第一篇博客

        第二天,很早的来到,不知道做些什么,未来也l许很忙碌,希望能够一直坚持,不管是难吃的饭菜,还是不良的作息,起码做个对得起这四个半月的人吧…

    Linux干货 2017-07-11
  • iptables

    Evernote Export   基于本机服务器的iptables: 创建、重命名、删除自定义chain ~]# iptables -N testchain ~]# iptables -nL Chain INPUT (policy ACCEPT) target     prot opt source    …

    Linux干货 2016-11-20
  • N25 第二周作业

    一.Linux上常用的文件管理类命令及用法示例     1.cp复制命令,具体有两个,一为单源复制,一种为多源复制。      常用选项         -i :交互式复制,覆盖之前提醒用户确认。       …

    Linux干货 2016-12-12