Linux系统定时任务

定时任务

##最简单版本,直接使用crontab -e修改里面的定时任务
* * * * * sh /root/start.sh

当你想要使用脚本对定时任务进行添加时

#使用脚本对crontab任务进行添加

##方法1,编辑 /var/spool/cron/用户名 ,简单但是需要该用户名下的权限 例如:
echo "* * * * * sh /root/start.sh" >> /var/spool/cron/root

##方法2,编辑 /etc/crontab 文件,需要用户名的权限,下面例子是'root'的权限:
echo "* * * * * root sh /root/start.sh" >> /etc/crontab

##方法3,使用crontab -l命令和crontab file两个命令实现
crontab -l > conf && echo "* * * * * sh /root/start.sh" >> conf && crontab conf && rm -f conf

crontab的启动等命令

安装:apt-get install crond
启动:service crond start
重启:service crond restart
停止:service crond stop
检查状态:service crond status
查询:cron可用的命令:service crond
检查:Cronta工具是否安装:crontab -l

1. crontab 服务管理与访问控制

查看 crontab 软件包是否已安装

[root@localhost ~]$ rpm -a crontab

没有安装就通过yum方式安装

[root@localhost ~]$ yum install crontabs

crontab命令是需要crond 服务支持的,crond服务同样是独立的服务,所以启动和自启动方法如下:

[root@localhost ~]$ service crond restart
停止 crond:             [确定]

正在启动crond:        [确定]
#重启动crond服务

[root@localhost ~]$ chkconfig crond on
#设定crond服务为开机自启动

.crond服务默认是自启动的,如果服务器上有循环执行的系统定时任务,就不要关闭crond服务
了。
crontab命令和at命令类似,也是通过/etc/cron.allow和/etc/cron.deny文件来限制某些用户是否可以使用crontab命令的。而且原则也非常相似:

  • 当系统中有/etc/cron.allow文件时,只有希尔此文件的用户可以使用crontab命令,没有写入的用户不能使用crontab命令。同样如果有此文件,/etc/cron.deny文件会被忽略,/etc/cron.allow文件的优先级更高。
  • 当系统中只有/etc/cron. deny文件时,则写入此文件的用户不能使用crontab命令,没有写入文件的用户可以使用crontab命令。

这个规则基本和 at的规则一直,同样/etc/cron.allow文件的优先级比/etc/cron.deny文件的
优先级高,Linux中默认只有/etc/cron.deny 文件。

2. crontab 命令

语法格式:

[root@localhost ~]$ crontab [选项]

at 命令选项及含义

选项含义
-e创建、编辑crontab定时任务
-l查询crontab任务
-r删除当前用户所有的crontab任务,如果有多个任务,只想删除一个,可以用"crontab -e"
-u 用户名修改或删除其他用户的crontab任务,只有root可用
[root@localhost ~]$ crontab -e
#进入crontab编辑界面,会打vim编辑你的工作
* * * * * 执行的任务命令
分 时 日 月 周
创建好的定时任务会在/etc/crontab保存

在线工具:crontab执行时间计算

项目含义含义范围
第一个“*”一小时当中的第几分钟0-59
第二个“*”一天当中的第几小时0-23
第三个“*”一个月当中的第几天1-31
第四个“*”一年当中的第几月1-12
第五个“*”一周当中的星期几0-7(0和7都代表星期日)

另外,还有一些辅助的字符,大概有下面这些:

特殊字符代表意义
*代表任何时刻都接受的意思。举例来说,0 12 * * * command 日、月、周都是*,就代表着不论何月、何日的礼拜几的12:00都执行后续命令的意思。
,代表分隔时段的意思。举例来说,如果要执行的工作是3:00与6:00时,就会是:0 3,6 * * * command时间还是有五列,不过第二列是 3,6 ,代表3与6都适用
-代表一段时间范围内,举例来说,8点到12点之间的每小时的20分都进行一项工作:20 8-12 * * * command仔细看到第二列变成8-12.代表 8,9,10,11,12 都适用的意思
*/n那个n代表数字,即是每隔n单位间隔的意思,例如每五分钟进行一次,则:/5 * * * * 命令 用与/5来搭配,也可以写成0-59/5,意思相同

时间常用举例

  1. 每分钟定时执行一次规则:
    每1分钟执行: */1 * * * *或者* * * * *
    每5分钟执行: */5 * * * *
    每隔60分钟执行一次: */60 * * * *

  2. 每小时定时执行一次规则:
    每小时执行: 0 * * * *或者0 */1 * * *
    每天上午7点执行:0 7 * * *
    每天上午7点10分执行:10 7 * * *

  3. 每天定时执行一次规则:
    每天执行 0 0 * * *

  4. 每周定时执行一次规则:
    每周执行 0 0 * * 0

  5. 每月定时执行一次规则:
    每月执行 0 0 1 * *

  6. 每年定时执行一次规则:
    每年执行 0 0 1 1 *

其他例子

5 * * * * 指定每小时的第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命令。

例子1:让系统每隔5分钟,就向/tmp/test文件中写入一行“11”,验证一下系统定时任务是否会执行

[root@localhost ~]$ crontab -e
#进入编辑界面
*/5**** /bin/echo”11” >> /tmp/test

例子2:在系统在每周二的凌晨5点05分重启一次

[root@localhost ~]$ crontab -e
55** 2/sbin/shutdown -r now

例子3:在每月的1号,10号,15号的凌晨3点30分都定时执行日志备份脚本autobak. sh

[root@localhost ~]$ crontab -e
30 3 1,10,15**/root/sh/autobak.sh
[root@localhost ~]$ crontab -l
#查看root用户的crontab任务
[root@localhost ~]$ crontab -r
#删除root用户所有的定时任务,如果只想删除某一个定时任务,
#可以“crontab -e”进入编辑模式手工鹏除

crontab 的注意事项
在书写crontab定时任务时,需要注意几个注意事项,这里我们再强调下:

六个选项都不能为空,必须填写。如果不确定使用“*”代表任意时间;
crontab定时任务,最小有效时间是分钟,最大时间范围是月。像2020年某时执行,3点30分30秒这样的时间都不能识别;
在定义时间时,日期和星期最好不要在一条定时任务中出现,因为它们都是以天作为单位,非常容易让管理员混乱;
在定时任务中,不管是直接写命令,还是在脚本中写命令,最好都是用绝对路径。有时相对路径的命令会报错。

3. 系统的crontab 设置

“crontab -e”是每个用户执行的命令,也就是说不同的用户身份可以执行自己的定时任务。可是有些定时任务需要系统执行,这时我们就需要编辑/etc/crontab这个配置文件了。当然,并不是说写入/etc/crontab配置文件中的定时任务执行时,不需要用户身份,而是“crontab-e”命令定义定时任务时,默认用户身份是当前登录用户。而修改/etc/crontab配置文件时,定时任务的执行着身份是可以手工指定的。这样定时任务的执行会更加灵活,修改起来也更加方便。
那我们打开这个文件看看吧:

[root@localhost ~]$ vim /etc/crontab
SHELL=/bin/bash
#标示使用哪种shel1

PATH=/sbin:/bin:/usr/sbin:/usr/bin
#指定PATH环境变量,crontab是使用自己的 PATH,而不是用系统默认的,所以在定时任务中出现的命令最好使用大写

MAILTO=root
#如1果有报错输出,或命令结果又输出,会向root发信息
HOME=/
#标示主目录

For details see man 4 crontabs
#提示大家可以去“man 4 crontabs”查看帮助

#Example of job definition:
# .-----—--—------- minute (0 - 59)
# | .——-—-————---- hour (o - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12)OR jan,feb,mar, apr ...
# | | | | .---- day of week(O - 6)(Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri, sat
# | | | | |
# * * * * * user-name command to be executed
#分 时 日 月 周 执行者身份 命令
#列出文件格式,并加入了注释

在CentOS 6.x中,/etc/crontab这个文件也发生了变化,在CentOS 5.x中这个文件的内容大概是这个样子:

#以下输出,是在CentOS5.5当中
[root@localhost ~]$ vim /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/

# run-parts
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly

​ 在CentOS5.x版本中,/etc/crontab文件会使用run-parts脚本执行/etc/cron.{daily,weekly, monthly}目录中的所有文件。这个run-parts其实是一个shell脚本,保存在/usr/bin/run-parts,它的作用就是把其后面跟随的目录中的所有可执行文件依次执行。也就是说,如果我们想让某个脚本在每天都执行一次,可以不用手工去写定时任务,而只需要给这个脚本赋予执行权限,并把它放入/etc/cron.daily/目录中。这样这个脚本就会在每天的凌晨4点02分执行了。

​ 可是在CentOS 6.x版本中,/etc/crontab文件中不再有相关的段落,那么是否run-ptars这种定时任务执行方法不可用了呢?我们看到/etc/crontab中有一句提示,让我们“man 4 crontabs”来查看帮助,那么我们就看看这个帮助吧!在这个帮助中,明确写明了“在旧版本的crontab配置文件中,是通过run-parts脚本来调用cron.fdaily,weekly, monthly}目录,定时执行这些目录中的脚本。在当前系统中,为了避免cron和 anacron之间产生冲突,只要 anacron已经安装,就使用anacron来执行这些目录中的脚本。具体可以查看anacron(8)的帮助。”。对于anacron的用法,我们下面来介绍。

其实对我们用户来讲,我们并不需要知道这个定时任务到底是由哪个程序调用的。我们需要知道的事情是如何使用系统的crontab设置。这个新老版本的CentOS没有区别,配置方法都有两种:

  • 第一种方法就是我刚刚说过的,把你需要定时执行的工作写成脚本程序,并赋予执行权限,然后直接把这个脚本复制到/etc/cron.{daily,weekly,monthly}目录中的任意一个。比如我需要让某个脚本每周执行,那么就把这个脚本复制到/etc/cron.weekly/目中中。这样这个脚本就会每周执行一次,具体的执行时间要参考anacron的配置。
  • 第二种方法就是修改/etc/crontab这个配置文件,自己加入自己的定时任务,不过需要注意指定脚本的执行者身份。

例如:

[root@localhost ~]$ vi /etc/crontab
…省略部分输出…
* * * * * root run-parts /root/cron/
#让系统每分钟都执行一次/root/cron/目录中的脚本,脚本执行者是root用户。
#虽然在CentOS 6x中,不是直接通过此配置文件调用/etc/cron. fdaily,weekly, monthly}这些目录,
#但是run-parts脚本还是可以使用的。所以我完全可以参照CentOS 5.x的方法来写定时任务。
#使用run-parts脚本调用并执行/root/cron/目录中所有的可执行文件


[root@localhost ~]$ mkdir cron
#建立/root/cron目录
[root@localhost cron]$ vi /root/cron/hello. sh
#bin/bash
echo "hello" >>/root/cron/hello.log
#在/root/cron/hello.log 文件中写入hello
[root@localhost cron]$ chmod 755 hello. sh
#赋矛执行权限。
#因为hello.sh脚本放入了/root/cron目录,所以会每分钟执行一次。

只要保存/etc/crontab文件,这个定时任务就可以执行了,当然要确定crond服务是运行的。这两种方法都是可以使用的,具体看个人的习惯吧!不过要想修改/etc/crontab文件,当然我要是root用户才可以,普通不能修改,只能使用用户身份的crontab命令。

anacron
anacron 是用来干什么的呢?我们的Linux服务器如果不是24小时开机的,那么刚好在关机的时间段之内有系统定时任务(cron)需要执行,那么这些定时任务是不会执行的。也就是说,假设我们需要在凌晨5点05分执行系统的日志备份,但是我们的 Linux 服务器不是24小时开机的,在晚上需要关机,白天上班之后才会再次开机。这个定时任务的执行时间我们的服务器刚好没有开机,那么这个任务就不会执行了。a nacron 就是用来解决这个问题的。

anacron 会使用一天,七天,一个月作为检测周期,用来判断是否有定时任务在关机之后没有执行,如果有这样的任务,anacron 会在特定的时间重新执行这些定时任务。那么 anacron 是如何判断这些定时任务已经超过了执行时间呢?在系统的 /var/spool/anacron/ 目录中存在 cron. {fdaily, weekly, monthly} 文件,这些文件中都保存着 anacron上次执行时的时间。anacron 会去读取这些文件中的时间,然后和当前时间做比较,若果两个时间的差值超过了 anacron 的指定时间差值(一般是1天,7天和一个月),就说明有定时任务漏掉了没有被执行,这时anacron会介入而执行这个漏掉的定时任务,从而保证在关机时没有被执行的定时任务不会被漏掉。

在CentOS 6.x中,我们使用 cronie-anacron 取代了 vixie-cron 软件包。而且在原先CentOS版本中 /etc/cron. {daily,weekly,monthly} 这些目录中的定时任务会同时被cron和 anacron调用,这样非常容易出现重复执行同一个定时任务的错误。在现在的CentOS 6.x中,/etc/cron.{fdaily,weekly,monthly}目录中的定时任务程序只会被 anacron 调用,从而保证这些定时任务只会在每天、每周或每月被定时执行一次,而不会重复执行。这也是我们在上一个小节中介绍的CentOS6.x的变化之一。

在CentOS 6.x中 anacron 还有一个变化,anacron 不再是单独的服务,而变成了系统命令。也就是说我们不再可以使用 “service anacron restart” 命令来管理 anacron 服务了。而是需要使用 anacron 命令来管理 anacron 工作。

具体命令如下:

[root@localhost ~]$ anacron[选项][工作名]
选项:
  -s:  开始 anacron 工作,依据 /etc/anacrontab 文件中的设定的延迟时间执行
  -n:  立即执行 /etc/anacrontab 中所有的工作,忽略所有的延迟时间
  -u:  更新/var/spool/anacron/cron.{daily, weekly,monthly}文件中的时间戳,但不执行任何工作

参数:
  工作名: 是依据/etc/anacrontab文件中定义的工作名

在我们当前的Linux中,其实不需要执行任何 anacron 命令,只需要配置好 /etc/anacrontab 文件,系统就会依赖这个文件中的设定来通过 anacron 执行定时任务。那么关键就是 /etc/anacrontab 文件的内容了,这个文件如下:

[root@localhost ~]$ vim /etc/anacrontab
# /etc/anacrontab: configuration file for anacron

# See anacron(8) and anacrontab(5)for details.

SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
#前面的内容和/etc/crontab类似

# the maximal random delay added to the base delay of the jobs
RANDOM_DELAY=45
#最大随机延迟。
#the jobs will be started during the following hours only
START_HOURS_RANGE=3-22
#anacron 的执行时问范围是3:00-22:00


#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
#天数强制延迟(分)工作名称       实际执行的命令
#时问差超过天数时,强制延迟多少分钟之后,就执行命令

这个文件中“RANDOM_DELAY”定义的是最大随机延迟,也就是说cron.daily 任务如果超过1天没有执行,并不会马上执行,而是先延迟强制延迟时间之后,再延迟随机延迟时间之后再执行命令。“START_HOURS_RANGE”定义anacron的执行时间范围,anacron只会在这个时间范围之内执行。我们用cron. daily工作来说明下/etc/anacrontab的执行过程:

  • 首先读取/var/spool/anacron/cron.daily中的上一次anacron执行的时间;
  • 和当前时间比较,如果两个时间的差值超过1天,就执行cron.daily工作;
  • 执行这个工作只能在03:00-22:00之间;
  • 执行工作时强制延迟时间为5分钟,再随机延迟0-45分钟时间;
  • 使用nice命令指定默认优先级,使用run-parts脚本执行/etc/cron.daily目录中的所有可执行文件。

大家发现了吧,/etc/cron. {daily,weekly, monthly} 中的脚本,在当前的Linux中是被anacron调用的,不再依靠cron服务。不过anacron不用设置多余的配置,我们只需要把需要定时执行的脚本放入 /etc/cron.{daily,weekly,monthly} 目录当中,就会每天、每周或每月执行,而且也不再需要启动 anacron 服务了。我们如果做修改的话,只用修改 /etc/anacrontab 配置文件即可。比如我更加习惯让定时任务在凌晨03:00-05:00执行,就可以如下修改:

[root@localhost ~]$ vim /etc/anacrontab
# /etc/anacrontab: configuration file for anacron

# See anacron(8) and anacrontab(5)for details.

SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
#前面的内容和/etc/crontab类似

# the maximal random delay added to the base delay of the jobs
RANDOM_DELAY=45
#最大随机延迟。
#the jobs will be started during the following hours only
START_HOURS_RANGE=3-22
#anacron 的执行时问范围是3:00-22:00


#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
#天数强制延迟(分)工作名称       实际执行的命令
#时问差超过天数时,强制延迟多少分钟之后,就执行命令

这样我们所有放入/etc/cron. {daily, weekly, monthly}目录中的脚本都会在指定时间运行了,而且也不怕服务器万一关机的情况了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值