一、crond简介

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

由于crond 是Linux的内置服务,但它不自动起来,可以用以下的方法启动、关闭这个服务:

1

2

3

4

5

6

7

8

/sbin/service crond start //启动服务

/sbin/service crond stop //关闭服务

/sbin/service crond restart //重启服务

/sbin/service crond reload //重新载入配置

或者使用下面的命令:

/etc/init.d/crond start

/etc/init.d/crond restart

/etc/init.d/crond stop

设置crond服务开机自启动:

1

[root@gin tmp]# chkconfig crond on

特殊需要:crond服务搞不定了,一般工作中写脚本守护程序执行:

1

2

3

4

5

6

[root@gin tmp]# cat cron.sh

while true

do

        echo "I am Bruce Lee"

        sleep 1

done

程序文件:程序代码组成,但是没有在计算机内执行。当前没有执行。

守护程序或守护进程:进程就是所算机中正在执行的程序,守护进程就是保护正在一直运行的程序。

Linux下的任务调度分为两类,系统任务调度和用户任务调度。

A. 系统任务调度:

系统周期性所要执行的工作,比如写缓存数据到硬盘、日志清理等。在/etc目录下有一个crontab文件,这个就是系统任务调度的配置文件。

/etc/crontab文件包括下面几行:

1

2

3

4

5

6

7

8

9

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

前四行是用来配置crond任务运行的环境变量

第一行SHELL变量指定了系统要使用哪个shell,这里是bash

第二行PATH变量指定了系统执 行命令的路径

第三行MAILTO变量指定了crond的任务执行信息将通过电子邮件发送给root用户,如果MAILTO变量的值为空,则表示不发送任 务执行信息给用户

第四行的HOME变量指定了在执行命令或者脚本时使用的主目录。第六至九行表示的含义将在下个小节详细讲述。这里不在多说。

B. 用户任务调度:

用户定期要执行的工作,比如用户数据备份、定时邮件提醒等。用户可以使用 crontab 工具来定制自己的计划任务。所有用户定义的crontab 文件都被保存在 /var/spool/cron目录中。其文件名与当前用户名一致。

严格的说,linux系统下的定时任务软件还真不少,例如:at , crontab , anacron。

at:适合仅执行一次就结束的调度任务命令,如:某天晚上需要处理一个任务,仅仅是这一天的晚上,属于突发性的工作任务。要执行at命令,还需要启动一个名为atd的服务才行。在生产环境中此需要会很少用到。因此,建议不要深入研究!

提示:

1:我们所说的crond服务是运行的程序,而crontab命令用户用来设置定时规则的命令

2:crond服务是企业生产工作中常用的重要服务,at和anacron很少使用,可以忽略

3:几乎每个服务器都会用到crond服务

二、crontab工具的使用

(1)crontab的使用格式

crontab常用的使用格式有如下两种:

1

2

crontab [-u user] [file]

crontab [-u user] [-e|-l|-r |-i]

选项含义如下:

参数名称

含义

指定示例

-l

显示用户crontab文件内容,l即list

crontab -l

-e

编辑某个用户的crontab文件内容。如果不指定用户,则表示编辑当前用户的crontab文件。

crontab -e

-i

在删除用户的crontab文件时给确认提示。

crontab -ri

-r

从/var/spool/cron目录中删除某个用户的crontab文件,不指定用户,则删除当前用户的crontab文件。

crontab -r

-u

用来设定某个用户的crontab服务,此参数一般由root用户来运行

crontab -u root -l

常用的选项命令为 l and e!crontab -e 相当于 vi /var/spool/cron/root ; crontab -l 相当于 cat /var/spool/cron/root

使用者权限文件:

文件

说明

/etc/cron.deny

该文件中所列用户不允许使用crontab命令

/etc/cron.allow

该文件中所列用户允许使用crontab命令

/var/spool/cron/

所有用户crontab文件存放的目录,以用户名命令

(2)crontab文件的含义

用户所建立的crontab文件中,每一行都代表一项任务,每行的每个字段代表一项设置,它的格式共分为六个字段,前五段是时间设定段,第六段是要执行的命令段,格式如下:

1

minute   hour   day   month   week   command

其中:

1

2

3

4

5

6

* minute: 表示分钟,可以是从0到59之间的任何整数。

* hour:表示小时,可以是从0到23之间的任何整数。

* day:表示日期,可以是从1到31之间的任何整数。

* month:表示月份,可以是从1到12之间的任何整数。

* week:表示星期几,可以是从0到7之间的任何整数,这里的0或7代表星期日。

command:要执行的命令,可以是系统命令,也可以是自己编写的脚本文件。

在以上各个字段中,还可以使用以下特殊字符:

1

2

3

4

* 星号(*):代表所有可能的值,例如month字段如果是星号,则表示在满足其它字段的制约条件后每月都执行该命令操作。

* 逗号(,):可以用逗号隔开的值指定一个列表范围,例如,“1,2,5,7,8,9”

* 中杠(-):可以用整数之间的中杠表示一个整数范围,例如“2-6”表示“2,3,4,5,6”

* 正斜线(/):可以用正斜线指定时间的间隔频率,例如“0-23/2”表示每两小时执行一次。同时正斜线可以和星号一起使用,例如*/10,如果用在minute字段,表示每十分钟执行一次。

(3)crontab文件举例

1

0 */3 * * * /usr/local/apache2/apachectl restart

#表示每隔3个小时重启apache服务一次。

1

30 3 * * 6 /webdata/bin/backup.sh

#表示每周六的3点30分执行/webdata/bin/backup.sh脚本的操作。

1

0 0 1,20 * *  fsck /dev/sdb8

#表示每个月的1号和20号检查/dev/sdb8磁盘设备。

1

10 5 */5 * *  echo "">/usr/local/apache2/log/access_log

#表示每个月的5号、10号、15号、20号、25号、30号的5点10分执行清理apache日志操作。

(4)任务调度设置文件的写法

可用crontab -e命令来编辑,编辑的是/var/spool/cron下对应用户的cron文件,也可以直接修改/etc/crontab文件

具体格式如下:

1

2

3

4

5

6

7

8

9

Minute Hour Day Month Dayofweek   command

分钟     小时   天     月       天每星期       命令

     每个字段代表的含义如下:

     Minute             每个小时的第几分钟执行该任务

     Hour               每天的第几个小时执行该任务

     Day                 每月的第几天执行该任务

     Month             每年的第几个月执行该任务

     DayOfWeek     每周的第几天执行该任务

     Command       指定要执行的程序

在这些字段里,除了“Command”是每次都必须指定的字段以外,其它字段皆为可选字段,可视需要决定。对于不指定的字段,要用“*”来填补其位置。

举例如下:

1

2

3

4

5

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表示星期一等。

1

2

3

4

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目录中的所有可执行文件

1

50   7       *             *     *     root     run-parts     /etc/cron.daily   [ 注:run-parts参数表示,执行后面目录中的所有可执行文件。

(5)cron文件语法:

1

2

分     小时    日       月       星期     命令

0-59   0-23   1-31   1-12     0-6     command     (取值范围,0表示周日一般一行对应一个任务)

记住几个特殊符号的含义:

1

2

3

4

“*”代表取值范围内的数字,

“/”代表”每”,

“-”代表从某个数字到某个数字,

“,”分开几个离散的数字

(6)应用案例

1:

30 30,12 * * * /bin/sh /scripts/andy.sh

在本例中,该定时任务的意思就是每天凌晨3点30分和中午12点30分执行/scripts/andy.sh

2:

30 */6 * * * /bin/sh /scripts/andy.sh

每隔6个小时的半点时刻执行后面的脚本任务

3:

30 8-18/2 * * * /bin/sh /scripts/andy.sh

8点到18点中每隔2小时的30分执行后面的脚本任务(也就是每天的8点半,10点半,12点半,14点半,16点半,18点半)

4:

45 4 1,10,22 * * /application/apache/bin/apachectl graceful

每月的1,10,22日的凌晨4:45分重启apache

5:

* 23,00-07/1 * * * /application/apache/bin/apachectl gracefull

上面的例子并不表示晚上23点和早上0-7点之间每隔一小时重启apache

提示:以上结果是不规范的,也是不对的。

以上的定时任务的第一列为*,表示每分都执行任务即晚上23点和早上0-7点之间每隔一小时的每分都重启apache

三、 使用crontab工具的注意事项

(1)注意环境变量问题

有时我们创建了一个crontab,但是这个任务却无法自动执行,而手动执行这个任务却没有问题,这种情况一般是由于在crontab文件中没有配置环境变量引起的。

在crontab文件中定义多个调度任务时,需要特别注意的一个问题就是环境变量的设置,因为我们手动执行某个任务时,是在当前shell环境下进行的, 程序当然能找到环境变量,而系统自动执行任务调度时,是不会加载任何环境变量的,因此,就需要在crontab文件中指定任务运行所需的所有环境变量,这样,系统执行任务调度时就没有问题了。

(2)注意清理系统用户的邮件日志

每条任务调度执行完毕,系统都会将任务输出信息通过电子邮件的形式发送给当前系统用户,这样日积月累,日志信息会非常大,可能会影响系统的正常运行,因此,将每条任务进行重定向处理非常重要。

例如,可以在crontab文件中设置如下形式,忽略日志输出:

1

0 */3 * * * /usr/local/apache2/apachectl restart >/dev/null 2>&1

“/dev/null 2>&1”表示先将标准输出重定向到/dev/null,然后将标准错误重定向到标准输出,由于标准输出已经重定向到了/dev/null,因此标准错误也会重定向到/dev/null,这样日志输出问题就解决了。

为crontab中的任务增加自己的日志,这样出错后,比较容易看到原因。

1

0 6 * * * $HOME/for_crontab/createTomorrowTables >> $HOME/for_crontab/mylog.log 2>&1

把错误输出和标准输出都输出到mylog.log中。

注意:不要写成

1

0 6 * * * $HOME/for_crontab/createTomorrowTables 2>&1 >> $HOME/for_crontab/mylog.log

否则就输出到标准输出了

(3)系统级任务调度与用户级任务调度

系统级任务调度主要完成系统的一些维护操作,用户级任务调度主要完成用户自定义的一些任务,可以将用户级任务调度放到系统级任务调度来完成(不建议这么做),但是反过来却不行,root用户的任务调度操作可以通过“crontab –uroot –e”来设置,也可以将调度任务直接写入/etc/crontab文件,需要注意的是,如果要定义一个定时重启系统的任务,就必须将任务放到/etc /crontab文件,即使在root用户下创建一个定时重启系统的任务也是无效的。

四:企业生产场景如何调试crontab定时任务

(1)增加执行任务频率调试任务(某些任务不能用于生产环境,没有测试机会)

代码发布:个人开发环境 -- 办公测试环境 -- IDC机房测试环境 -- IDC正式环境(分组,灰度发布)

(2)调整系统时间调试任务(不能直接用于生产环境),保持五分钟

(3)通过脚本日志输出调试定时任务

(4)注意一些任务命令带来的问题

(5)注意环境变量导致的定时任务故障(java环境变量问题: http://oldboy.blog.51cto.com/2561410/1541515)

(6)通过crond定时任务服务日志调试定时任务(/var/log/cron)

(7)其他稀奇古怪的问题调试的办法

五:crontab定时任务生产应用问题八箴言

1:系统环境变量问题

2:定时任务要用绝对路径

3:脚本权限问题加/bin/sh

4:时间变量问题用反斜线\%转义,最好用脚本

5:>/dev/null 2>&1问题(1>/dev/null  2>/dev/null  &>/dev/null)

6:定时任务规则之前加注释

7:使用脚本程序替代命令行定时任务

8:避免不必要的程序及命令输出

9:切到目标目录的上一级打包目标

10:定时任务脚本中的程序命令尽量用全路径(和环境变量的识别有关)

六:练习题

一:每周六,日上午9:00 和下午14:00去参加linux培训学习(执行/gin/scripts/poe.sh)

要求:/gin/scripts/poe.sh脚本的功能是打印当天的日期:格式为:2016-00-10,可以随意!

1:定时任务一定尽量用脚本实现

2:命令行操作成功,然后放到脚本执行成功,最后再配置任务

3:复制操作成功的命令行脚本,再定时任务里配置。

解答:

步骤1:创建目录/gin/scripts和编写poe.sh脚本

1

2

3

4

[root@Gin scripts]# mkdir /gin/scripts -p

[root@Gin scripts]# echo 'date +%F' >poe.sh

[root@Gin scripts]# /bin/sh /gin/scripts/poe.sh

2017-01-30

步骤2:书写定时任务

1

2

3

4

5

6

[root@Gin scripts]# echo '#study to linux' >>/var/spool/cron/root

[root@Gin scripts]# echo '00 09,14 * * 6,0 /bin/sh /gin/scripts/poe.sh >/dev/null 2>&1' >>/var/spool/cron/root

[root@Gin scripts]# crontab -l

*/10 * * * * /usr/sbin/ntpdate time.nist.gov >/dev/null 2>&1

#study to linux

00 09,14 * * 6,0 /bin/sh /gin/scripts/poe.sh >/dev/null 2>&1

也可以输入crontab -e 然后写入如下内容保存:

1

2

#study to linux

00 09,14 * * 6,0 /bin/sh /server/scripts/poe.sh >/dev/null 2>&1

书写定时任务的若干要领方法:

1:为定时任务规则加必要的注释

2:定时任务命令或程序最好写到脚本里执行

3:执行shell脚本任务前加/bin/sh

4:定时任务命令或脚本结尾加 >/dev/null 2>&1

结尾为什么要加 >/dev/null 2>&1呢?

C5:sendmail : /var/spool/clientmqueue/  -> 邮件的临时队列目录

系统中开启了 cron,而cron中执行的程序有输出内容,输出内容会以邮件形式发给cron的用户,而sendmail没有启动所以就会在上述目录产生N个小文件,导致的后果就是把磁盘的inode满。 -> no space left on device.

C6:postfix  /var/spool/postfix/maildrop/  and  /var/spool/postfix/maildrop,同上,小文件太多造成inode索引使用完

问题表现和检查:

1):运行 df -i 查看inode使用是否满

2):查看/var/spool/postfix/maildrop 是否有非常多的小文件,ls直接卡死等情况;

解决:

1):cd /var/spool/postfix/maildrop; ls|xrags rm -f;

2):vi /etc/crontab; 将’MAILTO=root’替换成’MAILTO=””’,然后service crond restart即可。如不行则 crontab -e第一行增加’MAILTO=””’。

5:在指定用户下执行相关的定时任务

6:生产任务程序不要随意打印输出信息 , tar zcf echo 123>a.log

7:定时任务执行的脚本要规范路径(/server/scripts)

8:配置定时任务规范操作过程

二:每隔两小时将系统文件/etc/service文件打包备份到/tmp下(每次备份按时间生成不同的备份包)

(1)在命令行把具体打包命令调用成功

1

2

3

4

5

6

[root@gin etc]# cd /etc

[root@gin etc]# tar zcvf /tmp/services_$(date +%F-%H).tar.gz ./services

./services

[root@gin etc]# ll /tmp

-rw-r--r--. 1 root root 641020 Oct  2  2013 services

-rw-r--r--  1 root root 127304 Oct  7 20:57 services_2016-10-07-20.tar.gz

(2)写脚本 /server/scripts/tar.sh

1

2

3

4

5

6

7

[root@gin scripts]# cd /server/scripts/

[root@gin scripts]# vim tar.sh

cd /etc && tar zcf /tmp/services_$(date +%F-%H).tar.gz ./services

//测试脚本是否可以运行成功

[root@gin scripts]# /bin/sh /server/scripts/tar.sh

[root@gin scripts]# ll /tmp

-rw-r--r-- 1 root root 127304 Oct  7 21:18 services_2016-10-07-21.tar.gz

(3)写入到定时任务中

1

2

3

4

5

6

7

8

9

[root@gin scripts]# crontab -e

//内容如下:

#tar for /etc/services 2 hours per

00 */2 * * * /bin/sh /server/scripts/tar.sh >/dev/null 2>&1

//测试脚本

[root@gin scripts]# /bin/sh -x /server/scripts/tar.sh       //-x表示查看命令执行过程

cd /etc

++ date +%F-%H

tar zcf /tmp/services_2016-10-07-22.tar.gz ./services

定时任务每次执行,都会产生日志文件,定时任务的日志文件目录:

1

2

3

4

5

6

7

[root@gin scripts]# ll /var/log/cron*

-rw-------  1 root root 25801 Oct  7 21:30 /var/log/cron

-rw-------. 1 root root  5706 Sep  7 16:10 /var/log/cron-20160907

-rw-------  1 root root  8547 Sep 11 11:24 /var/log/cron-20160911

-rw-------  1 root root 38127 Sep 27 10:50 /var/log/cron-20160927

-rw-------  1 root root 19588 Oct  2 11:18 /var/log/cron-20161002

[root@gin scripts]# cat /var/log/cron       //查看日志

三:每分钟打印一次自己的名字到/server/log/自己的名字命名的文件中

1

2

3

[root@Gin scripts]# crontab -e

#print char task by andy for programer A at 2016-10-10

*/1 * * * * echo “andy” >/server/log/andy.log 2>&1

四:每隔1分钟,打印一个+号到andy.log

1

2

echo #print a “+” every min by andy 2016-10-10’>>/var/spool/cron/root

echo ‘*/1 * * * * echo + >>/tmp/andy.log’>>/var/spool/cron/root

或者:

1

2

[root@Andy andy]# echo '#!/bin/bash' >echo.sh

[root@Andy andy]# echo 'echo `date` >>/tmp/andy.log' >>echo.sh

-----------------------------------------------------------------------

作者:琴酒网络

来源:博客园

链接:https://www.cnblogs.com/ginvip/p/6358071.html?utm_source=itdadao&utm_medium=referral

Linux定时任务crond服务相关推荐

  1. linux 定时任务 crond 服务介绍

    linux定时任务crond服务应用指南 Linux的定时任务crond(crontab)服务 1.crond是什么? crond是linux系统中用来定期执行命令或者指定程序的程序(软件) 2.秒级 ...

  2. linux未被识别crond服务,linux 定时任务 crond 服务介绍

    linux定时任务crond服务应用指南 Linux的定时任务crond(crontab)服务 1.crond是什么? crond是linux系统中用来定期执行命令或者指定程序的程序(软件) 2.秒级 ...

  3. linux查看定时服务,linux 定时任务 crond 服务介绍

    linux定时任务crond服务应用指南 Linux的定时任务crond(crontab)服务 1.crond是什么? crond是linux系统中用来定期执行命令或者指定程序的程序(软件) 2.秒级 ...

  4. Linux服务项目实例,linux 定时任务 crond 服务应用指南(项目实例)

    linux定时任务crond服务应用指南 Linux的定时任务crond(crontab)服务 1.crond是什么? crond是linux系统中用来定期执行命令或者指定程序的程序(软件) 2.秒级 ...

  5. linux定时任务Crond生产规范案例精讲09

    linux定时任务Crond生产规范案例精讲09说明:本文来自老男孩linux运维实战培训-就业课程视频内容,本文内容为系列内容,更多分享信息见:http://oldboy.blog.51cto.co ...

  6. linux定时任务打印日志,Centos7(linux)使用crond服务定时执行js脚本并将脚本的输出内容记录日志文件的简单应用...

    - ## 在Centos7.8上使用crond服务定时执行js脚本并将脚本执行的输出记录日志 1. 安装wget 2. wget https://npm.taobao.org/mirrors/node ...

  7. linux 定时任务crond

    1.定时任务crond 1.1 crond是什么 crond是linux系统中用来定期执行命令或指定程序任务的一种服务或软件.特殊需求:(秒级别)crond服务就无法搞定了,一般工作中写脚本守护进程执 ...

  8. linux定时任务crond那些事!

    来自老男孩教育的运维班面授课程内容,17期依良同学作业整理而得! 1.定时任务crond介绍 1.1 crond是什么 crond是linux系统中用来定期执行命令或指定程序任务的一种服务或软件. 特 ...

  9. linux定时任务crond

    本文内容是基于CentOS 6.5,如果是其它版本(如:CenOS 7.0),命令可能会有区别. [root@localhost ~]# cat /etc/redhat-release CentOS ...

最新文章

  1. VS2015编译ffmpeg 3.4.2
  2. C编程,随机数,排序
  3. wxWidgets:wxSocketBase类用法
  4. c语言see函数,vprintf() - C语言库函数
  5. 推理集 —— 现象与观察
  6. Mac下Intellij IDea发布JavaWeb项目 详解一 (1、新建JavaEE Project并进行相应设置 2、配置tomcat)...
  7. C++11 using定义类型别名、模板别名
  8. 优酷ts转换mp4_下载腾讯视频并转成MP4
  9. MATLAB VMD分解 变分模态分解 信号预处理 特征提取 及其改进算法
  10. javascript中map和filter的区别
  11. Linux基本操作之虚拟机和主机的域名映射
  12. mac 的 excel 替换换行符
  13. 初创企业如何做高效持续交付
  14. 百度提交死链的官方标准格式
  15. SAP MM 供应商无英文名称,ME21N里却带出了英文名字?
  16. 手机qq通讯录+for+android+v2.3,qq手机通讯录同步软件
  17. 天猫商城如何创建店铺宝营销活动?
  18. Nios ii 实战篇--- DDR2
  19. 九阴白骨爪的英文翻译
  20. Windows下的Gvim使用微软雅黑字体

热门文章

  1. CLAN Studio Toolkits - Icon Creator
  2. 3d max 视图快捷键
  3. 全速前进! AI助力工业制造智能升级
  4. CMOS反相器的工作原理和电路结构
  5. [JSOI2019]节日庆典
  6. 你好,李焕英主题曲依兰爱情故事下载
  7. Spark cache和checkpoint机制
  8. mac安装MySQL-very easy
  9. 智能电网势头好 电能表商纷纷扩张产能
  10. 国产手机厂商扎堆海外,vivo成国际化标杆