Linux利用crontab创建计划任务详解

来源:互联网 发布:斯诺登现状2017 知乎 编辑:程序博客网 时间:2024/05/17 03:03


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)不会自动补救








原创粉丝点击