博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Linux下定时任务 - crontab(资源)
阅读量:6907 次
发布时间:2019-06-27

本文共 9321 字,大约阅读时间需要 31 分钟。

hot3.png

crontab介绍

crond 是linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务 工具,并且会自动启动crond进程,crond进程每分钟会定期检查是否有要执行的任务,如果有要执行的任务,则自动执行该任务。

周期性地执行某任务 :

       cron : 自身是一个不间断运行的服务;

       anacron : cron的补充,能够实现让cron因为各种原因在过去的时间该执行而未执行的任务在恢复正常执行一次;

 

cron的种类 : 

    系统cron任务 : 

              /etc/crontab                 #系统cron任务所在目录

                     分钟    小时   天   月    周   用户   任务

    用户cron任务 : 

              /var/spool/cron/USERNAME                 #系统cron任务所在目录

                     分钟    小时   天   月    周   任务

时间的有效取值 : 

           分钟 : 0-59

           小时 : 0-23

           天  : 1-31

           月 : 1-12

           周 : 0-7 ,0和7都表示周日           

    时间通配表示 : 

           * : 对应时间的所有有效取值

                 3 * * * * 

                 3 * * * *7

                 3 * * * 6 7 

         , : 离散时间点 : 

              10,20 * * 2,5                  #周二和周五,每隔10分钟,20分钟执行一次

         -: 连续时间点 : 

              10,20 * * 2-5                     #周二到周五,每隔10分钟,20分钟执行一次

     每两个小时执行一次 : 

              08 */2 * * *

     每两天执行一次 :

              08  04 */2 * *

执行结果将以邮件形式发送给管理员

              */3 * * * * cat /etc/fstab &> /dev/null     

 

每天两点,备份zabbix mysql discuz数据库。

#crontab -e

0 2 * * * sh auto_backup_mysql.sh zabbix mysql discuz >>/tmp/backup.log 2>&1

#crontab -l

五个星号 表示 : 天、小时、日 、月、星期、

2>&1     表示 :标准输出。

 

案例 : 

SHELL=/bin/bash

PATH=/sbin:/user/Sbin:/usr/sbin

MAILTO=root

HOME=/

 

# run-parts

01 * * * * root run-parts /etc/cron.hourly                   #每一分钟执行的结果,反馈给……

02 4 * * * root run-parts /etc/cron.daily                       #每天4点02,将执行的结果,反馈给……

02 4 * * 0 root run-parts /etc/cron.weekly                   #每周……

02 4 1 * * root run-parts /etc/cron.monthly                   #每月……

 

 cron的环境变量 : cron执行所有命令都去PATH环境变量指定的路径下去找

       PATH /bin:/sbin:/user/bin:/usr/sbin

用户任务的管理 : 

      crontab 命令: 

                   -l : 列出当前用户的所有cron任务

                   -e : 编辑

                   -r : 移除所有cron任务

                   -u USERNAME : 管理其用户的cron任务

 

一、cron服务

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

service crond start         //启动服务service crond stop          //关闭服务service crond restart       //重启服务service crond reload        //重新载入配置service crond status        //查看服务状态

 

二、cron的配置文件:

/var/spool/cron/ 这个目录下存放的是每个用户包括root的crontab任务,每个任务以创建者的名字命名,比如tom建的crontab任务对应的文件就是/var/spool/cron/tom。一般一个用户最多只有一个crontab文件。

 

三、/etc/crontab 这个文件负责安排由系统管理员制定的维护系统以及其他任务的crontab

SHELL=/bin/bashPATH=/sbin:/bin:/usr/sbin:/usr/binMAILTO=rootHOME=/ 

 

 # 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

 

MAILTO=root:是说,当 /etc/crontab 这个档案中的例行性命令发生错误时,会将错误讯息或者是屏幕显示的讯息传给谁?由于 root 并无法再用户端收信,因此,我通常都將这个 e-mail 改成自己的账号,好让我随时了解系统的状态!

01 * * * * root run-parts /etc/cron.hourly:在 #run-parts 这一行以后的命令,我们可以发现,五个数字后面接的是 root ,这一行代表的是『执行的级别为root身份』当然,你也可以将这一行改为成其他的身份!而 run-parts代表后面接的 /etc/cron.hourly 是『一个目录内(/etc/cron.hourly)的所有可执行文件』,也就是说,每个小时的01分,系统会以root身份去/etc/cron.hourly这个目录下执行所有可执行的文件!后面三行也是类似的意思!你可以到 /etc/ 底下去看看,系统本来就预设了这4个目录!你可以将每天需要执行的命令直接写到/etc/cron.daily即可,还不需要使用到crontab -e的程式!

四、/etc/cron.d/ 这个目录用来存放任何要执行的crontab文件或脚本。

Linux下的计划任务--crontabLinux下的计划任务--crontab

ce06f48d4aabd21a9f8b8cfcae50d5fa654.jpg

  1. MAILTO=root:是说,当 /etc/crontab 这个档案中的例行性命令发生错误时,会将错误讯息或者是屏幕显示的讯息传给谁?由于 root 并无法再用户端收信,因此,我通常都將这个 e-mail 改成自己的账号,好让我随时了解系统的状态!

  2. 01 * * * * root run-parts /etc/cron.hourly:在 #run-parts 这一行以后的命令,我们可以发现,五个数字后面接的是 root ,这一行代表的是『执行的级别为root身份』当然,你也可以将这一行改为成其他的身份!而 run-parts代表后面接的 /etc/cron.hourly 是『一个目录内(/etc/cron.hourly)的所有可执行文件』,也就是说,每个小时的01分,系统会以root身份去/etc/cron.hourly这个目录下执行所有可执行的文件!后面三行也是类似的意思!你可以到 /etc/ 底下去看看,系统本来就预设了这4个目录!你可以将每天需要执行的命令直接写到/etc/cron.daily即可,还不需要使用到crontab -e的程式!

五、权限

crontab权限问题到/var/adm/cron/下一看,文件cron.allow和cron.deny是否存在

用法如下:
1、如果两个文件都不存在,则只有root用户才能使用crontab命令。
2、如果cron.allow存在但cron.deny不存在,则只有列在cron.allow文件里的用户才能使用crontab命令,如果root用户也不在里面,则root用户也不能使用crontab。
3、如果cron.allow不存在, cron.deny存在,则只有列在cron.deny文件里面的用户不能使用crontab命令,其它用户都能使用。
4、如果两个文件都存在,则列在cron.allow文件中而且没有列在cron.deny中的用户可以使用crontab,如果两个文件中都有同一个用户,以cron.allow文件里面是否有该用户为准,如果cron.allow中有该用户,则可以使用crontab命令。

AIX 中 普通用户默认都有 crontab 权限,如果要限制用户使用 crontab ,就需要编辑/var/adm/cron/cron.deny

HP-UNIX 中默认普通用户没得crontab 权限 ,要想放开普通用户的crontab 权限可以编

 

六、创建cron脚本

第一步:写cron脚本文件,命名为crontest.cron。

 15,30,45,59 * * * * echo "xgmtest....." >> xgmtest.txt 表示,每隔15分钟,执行打印一次命令

 

第二步:添加定时任务。执行命令 “crontab crontest.cron”。搞定

第三步:"crontab -l" 查看定时任务是否成功或者检测/var/spool/cron下是否生成对应cron脚本

注意:这操作是直接替换该用户下的crontab,而不是新增

七、crontab用法

crontab命令用于安装、删除或者列出用于驱动cron后台进程的表格。用户把需要执行的命令序列放到crontab文件中以获得执行。

每个用户都可以有自己的crontab文件。/var/spool/cron下的crontab文件不可以直接创建或者直接修改。该crontab文件是通过crontab命令创建的

在crontab文件中如何输入需要执行的命令和时间。该文件中每行都包括六个域,其中前五个域是指定命令被执行的时间,最后一个域是要被执行的命令。

每个域之间使用空格或者制表符分隔。格式如下:

 minute hour day-of-month month-of-year day-of-week commands合法值 00-59 00-23 01-31 01-12 0-6 (0 is sunday)

bf239dc477cf8961895ff635cff86c1f13a.jpg

 

除了数字还有几个个特殊的符号就是""、"/"和"-"、",",代表所有的取值范围内的数字,"/"代表每的意思,"/5"表示每5个单位,"-"代表从某个数字到某个数字,","分开几个离散的数字。

-l 在标准输出上显示当前的crontab。

-r 删除当前的crontab文件。
-e 使用VISUAL或者EDITOR环境变量所指的编辑器编辑当前的crontab文件。当结束编辑离开时,编辑后的文件将自动安装。

八、例子:

每天早上6点

 0 6 * * * echo "Good morning." >> /tmp/test.txt //注意单纯echo,从屏幕上看不到任何输出,因为cron把任何输出都email到root的信箱了。

 

每两个小时

 0 */2 * * * echo "Have a break now." >> /tmp/test.txt

 

晚上11点到早上8点之间每两个小时和早上八点

 0 23-7/2,8 * * * echo "Have a good dream" >> /tmp/test.txt

 

每个月的4号和每个礼拜的礼拜一到礼拜三的早上11点

 0 11 4 * 1-3 command line

 

1月1日早上4点

 0 4 1 1 * command line SHELL=/bin/bash

PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root //如果出现错误,或者有数据输出,数据作为邮件发给这个帐号 HOME=/

每小时执行/etc/cron.hourly内的脚本

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

 

每天执行/etc/cron.daily内的脚本

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

 

每星期执行/etc/cron.weekly内的脚本

 22 4 * * 0 root run-parts /etc/cron.weekly

8-22点:每2分钟执行

7-8和23点:每10分钟执行一次

0-6点:每1 小时执行一次

*/2 8-22 * * * root /usr/bin/python /home/abc.py >>/data/logs/abc.log

9,19,29,39,49,59 7-8,23 * * * root /usr/bin/python /home/abc.py >>/data/logs/abc.log
59 0-6 * * * root /usr/bin/python /home/abc.py >>/data/logs/abc.log
 

每月去执行/etc/cron.monthly内的脚本

 42 4 1 * * root run-parts /etc/cron.monthly

 

注意: "run-parts"这个参数了,如果去掉这个参数的话,后面就可以写要运行的某个脚本名,而不是文件夹名。

每天的下午4点、5点、6点的5 min、15 min、25 min、35 min、45 min、55 min时执行命令。

 5,15,25,35,45,55 16,17,18 * * * command

 

每周一,三,五的下午3:00系统进入维护状态,重新启动系统。

 00 15 * * 1,3,5 shutdown -r +5

 

每小时的10分,40分执行用户目录下的innd/bbslin这个指令:

 10,40 * * * * innd/bbslink

 

每小时的1分执行用户目录下的bin/account这个指令:

 1 * * * * bin/account

 

每天早晨三点二十分执行用户目录下如下所示的两个指令(每个指令以;分隔):

 20 3 * * * (/bin/rm -f expire.ls logins.bad;bin/expire$#;expire.1st)

 

每年的一月和四月,4号到9号的3点12分和3点55分执行/bin/rm -f expire.1st这个指令:

 12,55 3 4-9 1,4 * /bin/rm -f expire.1st

 

每周末的凌晨一点钟执行一次系统的raid-check

0 1 * * Sun root /usr/sbin/raid-check

 

每天的4:02am分root用户执行/etc/cron.daily目录下的所有脚本,run-parts参数表示执行后面目录中的所有脚本。

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

 

每天的8-18每四小时,dodmaster用户执行hislogclear.sh脚本,即8:44,12:44,16:44,20:44四个时间点,会执行该脚本。

[21:57:56][dodmaster@mha3 ~]$ crontab -l44 8-20/4 * * * $HOME/.DailyShell/hislogclear.sh

 

每五分钟执行一次

*/5 * * * * echo "every five minute to do it" >> time.txt

  

每个工作日下午八点执行

0 20 * * 1-5 echo "every workday 20:00 to do it" >> time.txt

 

每分钟的30秒时执行,因为cron服务是每分钟被唤醒一次,所以要执行精确到秒的任务需要借助sleep命令。

* * * * * sleep 30; echo "every minute 30 second to do it" >> time.txt

 

每20秒执行一次,即表示在每分钟的0秒、20秒、40秒各执行一次(也可以是其他的步长是20秒的值,例如:5s、25s、45s)

* * * * * echo "every 20 second to do it" >> time.txt* * * * * sleep 20; echo "every 20 second to do it" >> time.txt* * * * * sleep 40; echo "every 20 second to do it" >> time.txt

 

 

使用案例  : 

1、配置本机每隔两天在凌晨3点20备份一次/etc目录,备份文件存放至/backup/etc/目录,文件名称如 : etc-2012-06-20.tar.bz2;

答  : 

20 3 */2 * *   cp /etc/ etc-2012-06-20.tar.bz2;                         #

 

2、CentOS系统时间与UTC时间不一致的解决方法

在 Linux中终端命令中执行以下命令:

1、vi /etc/sysconfig/clock   #编辑时间配置文件

     ZONE="Asia/Shanghai"

     UTC=false                          #设置为false,硬件时钟不于utc时间一致
     ARC=false

2、ln -sf /usr/share/zoneinfo/Asia/Shanghai    /etc/localtime    #linux的时区设置为上海时区

3、ntpdate 192.43.244.18    #对准时间

如果没有安装ntp服务器,刚需要先执行以下命令:

yum install ntp #安装ntp服务器

4、/sbin/hwclock --systohc   #设置硬件时间和一致并校准

好了,我们的CentOS linux系统时间和计算机硬件时间都是cst时间了,并且都是上海时区,终正常啦。

 

5、在 11 月份内,每天的早上 6 点到 12 点中,每隔 2 小时执行一次/usr/bin/httpd.sh 怎么

实现
0 6-12/2 * 11 * /usr/bin/httpd.sh

 

6、有一普通用户想在每周日凌晨零点零分定期备份/user/backup 到/tmp 目录下,该用

户应如何做?
参考答案:(1)第一种方法:
用户应使用 crontab –e 命令创建 crontab 文件。格式如下:
0 0 * * sun cp –r /user/backup /tmp
(2)第二种方法:
用户先在自己目录下新建文件 file,文件内容如下:
0 * * sun cp –r /user/backup /tmp
然后执行 crontab file 使生效。

 

7、系统管理员需每天做一定的重复工作,请按照下列要求,编制一个解决 方案 :

(1)在下午 4 :50 删除/abc 目录下的全部子目录和全部文件;
(2)从早 8:00~下午 6:00 每小时读取/xyz 目录下 x1 文件中每行第一个域的全部数据
加入到/backup 目录下的 bak01.txt 文件内;
(3)每逢星期一下午 5:50 将/data 目录下的所有目录和文件归档并压缩为文件:
backup.tar.gz;
(4)在下午 5:55 将 IDE 接口的 CD-ROM 卸载(假设:CD-ROM 的设备名为 hdc);
(5)在早晨 8:00 前开机后启动。
参考答案:
解决方案:
(1)用 vi 创建编辑一个名为 prgx 的 crontab 文件;
prgx 文件的内容:
50 16 * * * rm -r /abc/*
(2)、0 8-18/1 * * * cut -f1 /xyz/x1 >;>; /backup/bak01.txt
(3)、50 17 * * * tar zcvf backup.tar.gz /data
(4)、55 17 * * * umount /dev/hdc
(5)、由超级用户登录,用 crontab 执行 prgx 文件中的内容:
root:#crontab prgx;在每日早晨 8:00 之前开机后即可自动启动 crontab

 

8、

近期碰到个问题,服务器上线后,crontab都发生异常没有自动执行,查看了下日志,发现问题:

Apr 16 11:26:01 imysql.cn crond[28354]: (*system*) BAD FILE MODE (/etc/cron.d/flushhost)Apr 16 11:26:01 imysql.cn crond[28354]: (root) BAD FILE MODE (cron/root)

检查了下 /etc/cron.d/ 目录下的其他文件,发现 flushhost 的属性是 755,其他的则是 644,于是将这个脚本属性也改成644,问题解决。

另外,还同时修改了mysql安装包的install.sh脚本,新服安装完毕后,修改flushhost脚本的属性为644。

这个问题貌似只在个别版本的RHEL下碰到过,并不是所有的版本都有。

 

9、

 

10、

 

11、

 

12、

 

13、

 

14、

 

15、

 

16、

 

17、

 

18、

 

19、

 

20、

 

21、

 

22、

 

23、

 

 

24、

 

25、

 

 

 

链接 : 

Centos下crontab指定执行用户  : https://www.jb51.net/os/RedHat/517715.html

CentOS下如何实行计划任务?CentOS下实行计划任务的方法 : https://www.jb51.net/os/RedHat/517610.html

Linux下使用crontab定时备份MYSQL数据库   :  https://www.jianshu.com/p/c32e53d2cd2d

Linux之crontab定时任务   :  https://www.jianshu.com/p/838db0269fd0

linux使用find和crontab命令定期清理过期文件 : https://www.jb51.net/article/100538.htm

 

 

转载于:https://my.oschina.net/u/3803405/blog/1799485

你可能感兴趣的文章
生成XML文件,并保存到本地文件
查看>>
[TUTORIAL]How to setup SP_Flash_Tool_Linux (MTK/MediaTek Soc)
查看>>
[C++]const、typedef联合使用注意
查看>>
JavaScript引用类型之Array数组的栈方法与队列方法
查看>>
银行转账亲测
查看>>
上海租房攻略
查看>>
【Python爬虫学习笔记3】requests库
查看>>
Spring boot(四)Spring Boot 集成 MyBatis
查看>>
win7重装系统
查看>>
转:【高并发简单解决方案】redis缓存队列+mysql 批量入库+php离线整合
查看>>
列表和屏幕的相互调用之从列表调用屏幕
查看>>
loadrunner-2-13错误处理函数
查看>>
C# 中的 App.config 文件配置
查看>>
LeetCode 队列与BFS--岛屿的数量
查看>>
jmeter-noguimodel
查看>>
Git使用++
查看>>
实现DataGridView和DevExpress.GridControl表头全选功能
查看>>
读《构建之法》十一,十二章有感
查看>>
Storyboard全解析(1)
查看>>
[C++]基本类型转换
查看>>