crontab 周期性计划任务

cron是Linux下的定时执行工具,可以在无需人工干预的情况下运行作业。

当需要周期性地重复执行任务时可以使用cron服务;该服务每分钟检查一次,并执行符合条件的任务。

Linux任务调度的工作主要分为两类:

1)系统执行的工作:系统周期性所要执行的工作,如备份系统数据,清理缓存。

2)个人执行的工作:某个用户定期要做的工作,例如每隔十分钟检查邮件服务是否有新信。

1、查看服务是否启动

# service crond status

/etc/init.d/crond status

2、查看相关文件列表
# which crontab

rpm -qf /usr/bin/crontab ----查看属于那个软件包

# rpm -ql crontabs ----查看软件包带来的文件

rpm -ql cronie

/var/spool/cron 用户级别的计划任务存放目录(以用户命名)

/etc/cron.deny

/etc/pam.d/crond

/etc/rc.d/init.d/crond 启动脚本

/usr/bin/crontab 用户级别的命令,系统级别计划任务通过修改配置文件来设置

/usr/sbin/crond 二进制的命令

/etc/cron.d/ ----里面通常存放用来设定除了每天/每周/每月之外的定时任务,比如说每小时周期执行的任务和其他任何定时任务。

/etc/cron.d/0hourly 系统每小时第一分钟需要执行的任务

/etc/cron.deny 用户拒绝列表(在该文件中的用户不能使用cron服务)
/etc/crontab 该文件的作用相当于/etc/cron.d/下面的某一个文件,可以定义系统计划任务

/var/spool/cron 这个目录用来存放各个用户自己设定的定时任务,普通用户没有权限直接访问,必须通过crontab 命令(setuid)

/etc/cron.monthly/ 存放系统每个月需要执行的脚本

/etc/cron.weekly/ 存放系统每周需要执行的脚本

/etc/cron.daily/ 存放系统每天需要执行的脚本

/etc/cron.hourly/ 存放系统每小时需要执行的脚本

3、 crontab 格式说明
# cat /etc/crontab 这里存放有系统运行的一些调度程序。每个用户可以建立自己的调度crontab。

SHELL=/bin/bash                              默认的shell,告诉系统使用哪个shell

PATH=/sbin:/bin:/usr/sbin:/usr/bin     定义命令的路径

MAILTO=root                                     命令的执行结果以邮件的形式发送给root(不管是标准正确还是错误结果),如果MAILTO=“” ,代表不会发邮件给任何人。

HOME=/                                            定义在执行命令或脚本时的主目录

# 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

分 时 日月 周

前5个字段分别表示:

分钟:0-59

小时:0-23

日期:1-31

月份:1-12

星期:0-7(0表示周日或者7表示周日)

还可以用一些特殊符号:
,: 表示分割,间隔。如第二个*表示成 8,10,就表示8点和10点
- :表示一个段,如第二个*表示成 1-5,就表示1到5点
/n : 表示每个n的单位执行一次,如第二个*表示成*/1, 就表示每隔1个小时执行一次命令。

* 8,10 * * *   --每天的8点和10点

* * 2-8 * *        --每月的2号到8号

*/5 * * * *         --每隔5分钟

00 8,10,12 * * 1,3    --周一和周三的8-12小时每隔2小时

00 8-12/2 * * 1,3           --周一和周三的8-12小时每隔2小时

每天1号到5号,10号到15号的每天凌晨4点8分

08 04 1-5,10-15 * *

以下4行是rhel5里的配置;rhell6看不到,但是也生效

01 * * * * root run-parts /etc/cron.hourly/            ----每小时的第一个分钟执行,可以把要执行的脚本文件放在同一目录下面

02 04 * * * root run-parts /etc/cron.daily/

22 04 * *7 root run-parts /etc/cron.weekly/

42 041** root run-parts /etc/cron.monthly/

错开执行时间,放置系统出现峰值

注意:

run-parts:


cron用这个工具来执行某个目录下所有的可执行脚本,定时任务中的每小时/每天/每周/每月任务就是通过这个工具来触发的。

通过修改配置文件制定计划任务:

/etc/cron.d/中的文件的范例:

# cat /etc/cron.d/0hourly

SHELL=/bin/bash

PATH=/sbin:/bin:/usr/sbin:/usr/bin

MAILTO=root

HOME=/

01 * * * * root run-parts /etc/cron.hourly

* * * * * 用户名 命令 脚本文件

run-parts /目录

可执行的脚本文件
没有权限解决办法:

方法1、用权限命令chmod +x

方法2、01 * * * * root bash(或者sh) run-parts /etc/cron.hourly

----bash解释器直接解释脚本文件

每小时的第一分钟,以root用户执行/etc/cron.hourly目录下的脚本

=====================================================

1、制定系统计划任务
方法一:自己编写计划任务文件
# crontab -e
--创建计划任务。如果有很多的话可以写在一起,如果要删除其中一条计划任务的话可以进去这里直接删除或者注释即可,默认是root用户创建的计划任务。

方法二:将自己的计划任务放到相应的系统任务目录里

系统自己的计划任务:/etc/cron.{daily,weekly,monthly}

----直接进去这个目录创建一个文件再创建周期计划

SHELL=/bin/bash

PATH=/sbin:/bin:/usr/sbin:/usr/bin

MAILTO=root

HOME=/

01 * * * * root run-parts /etc/cron.hourly

* * * * * 用户名 命令 脚本文件

run-parts

可执行的脚本文件

2、 设定用户级别的定时任务

相关命令:

普通用户编辑自己的定时任务
# crontab -e <--- 编辑当前用户自己的定时任务(使用环境变量EDITOR指定的默认编辑器)
#crontab -l
<--- 列出当前用户自己所有的定时任务
# crontab -r <--- 删除当前用户自己所有的定时任务,谨慎使用这个命令来删除计划任务。

一般是用crontab -e 进去把不想要的计划任务删除了
注意:用crontab -e 来创建计划任务wq保存退出后,在/var/spool/cron/下面可以看到相应的用户创建的计划任务,名字以创建计划任务的用户命名。

作为管理员,root可以设定/调整所有用户的定时任务,命令和上面类似,只是增加了一个-u <username> 的参数
# crontab -e -u redhat<--- 编辑指定用户(redhat)的定时任务(使用环境变量EDITOR指定的默认编辑器)
# crontab -l -u redhat<--- 列出指定用户所有的定时任务
# crontab -r -u redhat<--- 删除指定用户redhat所有的定时任务

说明:

1、crontab 默认调用的是vi编辑器,编辑计划任务的用法和vi一样。如果想自己定义编辑器,通过修改环境变量完成。如export EDITOR=vim

2、用户级别的任务定义当中,没有用户名那一栏,如果像定义系统级别的命令那样,输入用户名,crontab编辑器不会提示格式错误,但是任务不会得到正确的执行。

思考1:

如果系统断电或者宕机,错过任务执行的时间,怎么办?

可以使用anacron工具(下面介绍)。

=============================================================

anacron 任务:

是cron服务的扩展,配合cron服务一起使用,当系统断电或者宕机,错过任务执行的时间时,系统启动后它会再次执行未执行的任务。
配置文件:/etc/anacrontab

#period in days delay in minutes job-identifier command

命令执行的频率(天数) 延迟时间(分钟) 任务描述 要执行的命令

1 5 cron.daily nice run-parts /etc/cron.daily

7 25 cron.weekly nice run-parts /etc/cron.weekly

@monthly 45 cron.monthly nice run-parts /etc/cron.monthly

说明:对于每个计划任务,anacrontab先判断在period(执行频率)期间内是否被执行了,如果没执行则等待delay(延迟时间),再次执行该任务。

一般情况下该文件不用修改,知道原理就可以。

总结:

1、如果你有很多任务需要每天|周|月重复执行,并且希望系统能自动把漏掉的任务补回来。那么你可以将你的脚本存放到系统相应的目录下面/etc/cron.{daily,weekly,monthly},并赋予可执行权限。

2、以上需要系统定时去调用的任务就叫系统级别的定时任务。

练习:通过至少两种方法指定一个周期性的计划任务

1、stu01 用户每周日和周三的凌晨5点04分在查看/etc/hosts 文件内容并保存到/tmp/stu01文件中:

方法1:

# crontab -e -u stu1

4 5 * * 3,7 cat /etc/hosts >> /tmp/stu01

方法2:
# vim /tmp/jihua.sh

cat /etc/hosts >> /tmp/stu01
# chmod o+w /tmp/stu01
# # crontab -e -u stu1

4 5 * * 3,7 bash /tmp/jihua.sh
查看日志:tail -f /var/log/cron ---- -f 动态查看
可能出现的问题:如果查看日志可以看到用户的计划任务已经执行,但是没看到产生的文件。
原因:/tmp 文件没有给用户写的权限
解决:chmod o+w /tmp

2、root用户往/tmp/stu01/的文件里每隔2分钟追加当前的系统时间
# crontab -e

*/2 * * * * echo `date` >> /tmp/stu01

=========================================================

cron使用限制


/etc/cron.deny ——只拒绝哪些用户不能他用crontab,默认存在空文件

/etc/cron.allow ——允许哪些用户使用crontab

如果同一个用户即在拒绝里又在允许里,默认允许优先。

思考2

如果我用crontab -e写了晚上8:30去关机,但是我18点下课就手动关机了,第二天来9点开机,它会不会延迟一段时间又关机呢?

不会。只有在/etc/cron week daily 这类的文件里写的任务才会补救任务,其余方法(crontap)不会自动补救

Linux利用crontab创建计划任务详解的更多相关文章

  1. Linux中利用crontab创建计划任务

    在linux中启动crontab服务: /etc/init.d/crond  start crontab的命令格式 crontab -l   显示当前的crontab 文件(默认编写的crontab文 ...

  2. linux下crontab实现定时服务详解

    http://www.jb51.net/LINUXjishu/151805.html 任务调度的crond常驻命令 crond 是linux用来定期执行程序的命令.当安装完成操作系统之后,默认便会启动 ...

  3. Centos 7下利用crontab定时执行任务详解

    一 cron服务 cron服务是Linux的内置服务,但它不会开机自动启动.可以用以下命令启动和停止服务: /sbin/service crond start /sbin/service crond ...

  4. 【Python】Linux crontab定时任务配置方法(详解)

    CRONTAB概念/介绍 crontab命令用于设置周期性被执行的指令.该命令从标准输入设备读取指令,并将其存放于“crontab”文件中,以供之后读取和执行. cron 系统调度进程. 可以使用它在 ...

  5. Linux LVM逻辑卷配置过程详解(创建,增加,减少,删除,卸载)

    Linux LVM逻辑卷配置过程详解 许多Linux使用者安装操作系统时都会遇到这样的困境:如何精确评估和分配各个硬盘分区的容量,如果当初评估不准确,一旦系统分区不够用时可能不得不备份.删除相关数据, ...

  6. Linux实现利用SSH远程登录服务器详解

    Linux实现利用SSH远程登录服务器详解 http://www.111cn.net/sys/linux/55152.htm

  7. Linux Shell编程与编辑器使用详解

    <Linux Shell编程与编辑器使用详解> 基本信息 作者: 刘丽霞 杨宇 出版社:电子工业出版社 ISBN:9787121207174 上架时间:2013-7-22 出版日期:201 ...

  8. Linux Bash命令关于程序调试详解

    转载:http://os.51cto.com/art/201006/207230.htm 参考:<Linux shell 脚本攻略>Page22-23 Linux bash程序在程序员的使 ...

  9. MySQL 执行计划explain详解

    MySQL 执行计划explain详解 2015-08-10 13:56:27 分类: MySQL explain命令是查看查询优化器如何决定执行查询的主要方法.这个功能有局限性,并不总会说出真相,但 ...

随机推荐

  1. 电子检索实体书「GitHub 热点速览 v.22.12」

    不知道有没有小伙伴遇到实体书快速定位指定内容的问题,凭借着记忆里很难快速翻阅到正确的页数,但 paperless-ngx 也许能帮上你的忙,它除了能将你的实体书籍电子化变成文件库里的一员之外,还能帮你 ...

  2. SignalR 入门 .netCore实现聊天室

    SignalR 入门 .netCore实现聊天室 本文根据微软SignalR 简介 | Microsoft Docs 和 ASP.NET Core SignalR 简介 | Microsoft Doc ...

  3. Nginx--sub_filter模块

    客户端浏览器访问替换html中的字符: location / { root /web/htdocs; random_index on; index index.html index.htm; subs ...

  4. tensorflow2.4与目标检测API在3060显卡上的配置安装

    目前,由于3060显卡驱动版本默认>11.0,因此,其不能使用tensorflow1版本的任何接口,所以学习在tf2版本下的目标检测驱动是很有必要的,此配置过程同样适用于任何30系显卡配置tf2 ...

  5. linklist template

    #include <iostream.h> typedef int ElemType; typedef struct LNode { ElemType data; struct LNode ...

  6. Mysql之Explain关键字及常见的优化手段

    Explain关键字字段描述: Explain关键字字段详情描述 id 我们写的查询语句一般都以SELECT关键字开头,比较简单的查询语句里只有一个SELECT关键字,但是下边两种情况下在一条查询语句 ...

  7. DateUtils互转工具类

    public class DateUtils { /** * 取系统默认时区ID */ private static final ZoneId ZONE_ID; static { ZONE_ID = ...

  8. kafka中的回调函数

    kafka客户端中使用了很多的回调方式处理请求.基本思路是将回调函数暂存到ClientRequest中,而ClientRequest会暂存到inFlightRequests中,当返回response的 ...

  9. java中的generate

    流generate(Supplier s)返回无限顺序无序流,其中每个元素由提供的供应商生成.这适用于生成恒定流,随机元素流等. public class Flow { public static v ...

  10. Jpa设置默认值约束

    使用SpringDataJpa设置字段的默认值约束的2种方式 // 第一种方式是修改建表时的列定义属性 @Column(columnDefinition = "varchar(35) def ...