,,Linux定时任务Crontab命令使用详解与总结

,,Linux定时任务Crontab命令使用详解与总结

摘要:介绍了Crontab命令对Linux定时任务的详细解释,总结了Crontab命令的一些使用技巧以及工作中遇到的一些问题的解决方法。

Crontab命令是Unix和Linux用来设置周期性执行的命令,是互联网中非常常见的技术。许多任务将被设置为在crontab周期中执行。

如果你不使用Crontab,那么任务就是常驻程序,要求你的程序24X7小时停机,另外就是你的调度器可靠。在实践中,90%的程序都不需要花那么多时间和精力去解决以上两个问题。他们只需要通过工业程序Crontab编写自己的业务逻辑和时间表。crontab可靠且健康。

crontab命令简易入门

假设我要设置一个任务,每分钟同步一次数据。这个同步脚本的路径是/home/blue/do/rsyncfile.sh,所以我可以在这里配置它,使用blue用户并在终端输入。

crontab -e

#这时候你会进入vi的编辑界面编辑你的作品!请注意,每个作业都是一行。

#小时、日、月、周|=======完成命令行的任务

* * * * */home/blue/do/rsyncfile . sh

默认情况下,任何没有在/etc/cron.deny中列出的用户都可以直接发出“crontab-e”来编辑他的例程命令!如上所述,整个过程将进入vi的编辑屏幕,然后在一个作业行中进行编辑。编辑好后输入“:WQ”保存然后离开vi!

如果我们需要修改脚本以每5分钟运行一次数据同步,那么也使用crontab -e来输入编辑:

*/5 * * * */home/blue/do/rsync file . sh

如果服务器出了问题,有一天数据没有同步,那么我们就需要补数据。假设补数据的脚本是/home/blue/do /rsyncfile_day.sh,但是白天是高峰期,晚上用户不多,所以是低高峰期。我们补数据会占用很多带宽,尤其是白天,会影响正常业务。因此,一般来说,我们可以让数据任务在凌晨2点开始运行,所以

0 2 1 4 */home/blue/do/rsyncfile _ day . sh

就这样,4月1日凌晨2: 00,我们将开始数据补充的脚本。

同步数据是互联网公司的常见任务。在这里,你可以看到crontab的魅力。你只需要写最简单的业务逻辑,把调度交给crond,你就完成了一个可靠性很高的任务。如果非要自己写这种调度器,不知道要付出多大的努力才能做到可靠稳定。

crontab命令的语法

crontab [-u用户名] [-l|-e|-r]

选项和参数:

-u:只有root可以执行此任务,即创建/删除其他用户的crontab工作计划;

-e:编辑crontab的工作内容。

-l:查阅crontab的工作内容。

-r:删除crontab的所有工作内容。如果您只想删除一个项目,请使用-e来编辑它。

查询用户当前的crontab内容:

crontab -l

*/5 * * * */home/blue/do/rsync file . sh

0 2 1 4 */home/blue/do/rsyncfile _ day . sh

清空用户当前的crontab:

crontab -r

crontab -l

蓝色没有crontab

如果要删除当前用户的crontab任务,使用crontab -e进入编辑器,然后删除相应的任务。

crontab命令的限制

/etc/cron.allow:将可以使用crontab的帐号写入其中。不在该文件中的用户不能使用crontab

/etc/cron.deny:将不能使用crontab的帐户写入其中。如果没有记录该文件中的用户,可以使用crontab。

在优先级顺序上,/etc/cron.allow优先于/etc/cron.deny,而以上判断,只选择这两个文件中的一个进行限制。所以建议你只保留一个文件,以免影响你对配置的判断!一般来说,系统默认为/etc/cron.deny,你可以把不希望他运行crontab的用户写入/etc/cron.deny,每行一个账号!

crontab配置文件详解

Crontab -e是为用户的cron而设计的。如果是系统的例行任务,应该编辑/etc/crontab文件。

那就是crontab -e .这个crontab其实是/usr/bin/crontab的运行文件,但是/etc/crontab是一个“纯文本文件”。您必须以root用户身份编辑该文件。

首先,我们来看看crontab的文件内容。

卡特彼勒/etc/crontab

# /etc/crontab:系统范围的crontab

#与任何其他crontab不同,您不必运行“crontab”

#命令在编辑该文件时安装新版本

#和/etc/cron.d中的文件。这些文件也有用户名字段,

#其他crontabs都没有。

SHELL=/bin/sh

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

# m h dom mon dow用户命令

17 * * * * root CD/run-parts-report/etc/cron . hourly

25 6 * * * root test-x/usr/sbin/anacron | |(CD/run-parts-report/etc/cron . daily)

47 6 * * 7根测试-x/usr/sbin/anacron | |(CD/run-parts-report/etc/cron . weekly)

52 6 1 * *根测试-x/usr/sbin/anacron | |(CD/run-parts-report/etc/cron . monthly)

这个文档和我们刚刚发布的crontab -e的内容几乎一模一样!只有几处不同。

路径=.

这里是输入运行文件的搜索路径!使用默认路径配置就够了!

17 * * * * root CD/run-parts-report/etc/cron . hourly:

这个/etc/crontab中有四个预先配置好的任务,分别是每小时、每天、每周、每月!但是跟在五个字段后面的不是一个命令,而是一个新的字段,是“运行下面命令的身份”。为什么!这和用户的crontab -e不同,既然用户自己的crontab不需要指定身份,当然/etc/crontab需要!根据上表的内容,系统默认的例行工作是以root身份执行的。

那么最后一串命令是什么呢?你可以用哪个run-part来搜索看看。事实上,这是一个bash脚本!如果你直接进入/usr/bin/run-parts,你会发现这个命令会捕获下面目录中的所有文件并运行它!也就是说“如果你想让系统每小时主动为你运行一个命令,就把命令写成脚本,把文件放在/etc/cron.hourly/目录下”!

现在你知道系统是如何执行他默认的日常工作时间表的了吧?如果发出ll /etc/cron.daily,可以看到一堆文件。那些文件是系统提供的脚本,这一堆脚本每天早上6:25就会开始运行!

假设你现在想做一个目录,让系统每2分钟运行一次这个目录下的所有文件。您可以在/etc/crontab中编写下面一行:

*/2 * * * * root run-parts/etc/cron . min

当然,目录/etc/cron.min需要存在!如果我需要运行的只是一个“程序”,而不需要使用目录,该怎么办?怎么办?比如检测网络流量时,我们希望每五分钟检测分析一次。你可以这样写:

*/5 * * * * root/bin/mrtg/etc/mrtg/mrtg . CFG

怎么!创建常规命令很容易!如果你是系统管理员,你的工作是系统维护的日常任务,修改文件/etc/crontab就可以了!方便易管理!

crontab命令的原理

当用户使用crontab命令创建作业调度时,作业会被记录在/var/spool/cron/中,并以账号作为判断!比如blue使用crontab后,他的工作会被记录在/var/spool/cron/blue中!但是请注意,不要直接用vi编辑这个文件,因为输入的语法可能是错误的,可能会导致无法运行cron!另外,cron运行的每一个作业都会被记录在登录文件/var/log/cron中,所以罗,如果你的Linux不知道是否被植入了木马,也可以搜索登录文件/var/log/cron!

crond服务的最小检测限是“分钟”,所以“cron会每分钟读取/etc/crontab和/var/spool/cron中的数据内容”。所以只要编辑/etc/crontab文件并保存,cron的配置就会自动运行!

备注:Linux下的crontab会每分钟自动帮我们重新读取/etc/crontab的日常工作,但是由于某些原因或者其他Unix系统的原因,crontab在你修改/etc/crontab后可能不会立即运行。此时请重新启动该服务!/etc/init.d/cronrestart或服务cronrestart

crontab命令格式详解

每个任务(每行)的格式有六个字段。这六个字段的含义是:

代表意义

分钟

小时

日期(天数)

命令

数字范围

0-59

0-23

1-31

1-12

0-7

只管下命令。

更有趣的是那个“周”!当星期数是0或7时,表示“星期日”!此外,还有一些辅助字符,如下面的:

特殊字符

代表意义

*(星号)

意思是随时接受!比如例1中,日、月、周均为*,表示“任意日、月、日的12:00运行后续命令”!

,(逗号)

代表时间划分的意义。例如,如果要发布的工作在3:00和6:00,它将是:

0 3,6 * * *命令

还有五列时间参数,但是第二列是3和6,也就是说3和6都适用!

-(负号)

这意味着在某一段时间内,例如8: 00到12: 00之间每小时20分钟:

20 8-12 * * *命令

看第二列变成8-12!意思是8,9,10,11,12都适用!

/n(斜线)

那个N代表数,意思是“每N个单位区间”。例如,每五分钟一次,则:

*/5 * * * *命令

很简单!用*和/5搭配,也可以写成0-59/5,意思一样!

周、太阳、月亮不能同时并存。

还有一点需要注意的是:“可以分别按周或日月循环,但不能以‘今天是星期几,今天是星期几’的模式工作。“这意味着你不能写这样的工作时间表:

0 312 11 9 5根echo' just test'==这是错误的写法。

本来你以为9月11日是周五,可惜系统可能会决定每周五或者每年的9月11日做一次,会和你原来的计划不一样~所以罗,注意这个地方!上面写错了!

在CentOS下查看crontab执行历史

我给crontab添加了一个调度任务,但是发现没有得到预期的结果,所以怀疑crontab没有执行相应的任务,但是我怎么定位crontab有没有执行呢?

这需要查看crontab的执行历史,如下所示:

cd /var/log

尾巴-100克龙

可以参考cron文件中已经操作过的相关定时任务。

Crontab命令格式说明

我们可以使用crontab -e来添加要执行的命令。命令执行的结果,无论是标准输出还是错误输出,都会以邮件的形式发送给用户。

添加的命令必须采用以下格式:

* * * */命令路径

前五个字段可以取整数值来指定何时开始工作,第六个字段是一个字符串,也就是一个命令字段,其中包含crontab调度执行的命令。这些字段由空格和制表符分隔。

前五个字段代表:

分钟:0-59

时间:1-23小时

日期:1至31日

月份:1-12

周:0-6(0表示星期日)

您也可以使用一些特殊符号:

*:表示任何时间。

,表示除法。

-:表示一段,如:第二端1-5,表示1到5分。

/n:表示n的每个单元执行一次。例如,在第二段中,*/1表示命令每1小时执行一次。也可以写成1-23/1。

一些例子:

00 8,12,16 * * */data/app/scripts/monitor/df . sh

30 2 * * */data/app/scripts/hot backup/hot _ database _ backup . sh

10 8,12,16 * * */data/app/scripts/monitor/check _ ind _ unusable . sh

10 8,12,16 * * */data/app/scripts/monitor/check _ max filesize . sh

10 8,12,16 * * */data/app/scripts/monitor/check _ object size . sh

3 21 * * * 21: 43执行

5 05 * * * 05: 15执行

0 17 * * * 17:00

0 17 * * 1每周一17:00。

0,10 17 * * 0,2,3每周日,周二,周三17:00,17:10。

0-10,17,1 * * 1月1日17:00-7:10每隔1分钟执行一次。

0 1,15 * 1,10月1日,15日,1日0:00执行。

2 4 4 1 * *将于1月1日4:42执行。

0 21 * * 1-6周一至周六21:00。

每10分钟0,10,20,30,40,50 * * *次。

*/10 * * *每10分钟一次。

* 1 * * *从1:0到1:59,每1分钟执行一次

1 * * * 1: 00

0 */1 * * *每1小时0: 00。

每1小时0 * * * * 0: 00。

2-20/3 * * *在8: 02、11: 02、14: 02、17: 02和20: 02执行

0 35 1,15 * * 1,15五点半。

Crontab命令在后台执行。

当一个作业在前台运行时,终端被该作业占用;当作业在后台运行时,它不会占用终端。您可以使用命令将作业置于后台。

比如:

30 2 * * */data/app/scripts/hot backup/hot _ database _ backup . sh

在后台运行作业时要小心:需要用户交互的命令不应该在后台执行,因为那样你的机器只会在那里等待。

但是,如果作业在后台运行,它会将结果输出到屏幕上,并干扰您的工作。如果在后台运行的作业会产生大量输出,最好使用以下方法将其输出重定向到文件:

比如:

命令输出.文件21

在本例中,21表示所有标准输出和错误输出将被重定向到一个名为out.file的文件

Crontab命令 21 含义

先看一个例子:

0 2 * * * /u01/test.sh /dev/null 21

这句话的意思是在后台执行这个命令,将错误输出2重定向到标准输出1,然后将所有的标准输出1放入/dev/null文件,也就是清空它。

这里有几个数字:

0表示键盘输入。

1表示标准输出。

2表示错误输出。

我们也可以这样写:

0 2 * * */u01/test . sh 1/u01/out . file

0 2 * * */u01/test . sh 2/u01/out . file

0 2 * * */u01/test . sh 2/u01/out . file 21

将tesh.sh命令的输出重定向到out.file,即输出内容不打印在屏幕上,而是输出到out.file文件file。

21是将错误输出重定向到标准输出。然后将标准输入重定向到文件out.file

1表示文件描述1,表示标准输出。如果这里缺少它,它就变成数字1,这意味着重定向到文件1。

:后台执行

测试:

Ls 21:不会报告2号文件的错误,但会输出一个空文件1;

Ls xxx 21:没有xxx的这个文件的错误被输出到1;

Ls xxx 21:文件1不会生成,但是错误跑到标准输出;

ls xxxout.txt 21==ls xxx1 out . txt 21:因为重定向符号默认为1,所以这句话会将错误输出和标准输出都发送到out . txt文件中。

Crontab命令21之所以写在后面

格式:命令文件21==命令1文件21

首先,命令文件将标准输出重定向到文件,21是标准错误复制标准输出,标准输出也被重定向到文件。最终结果是标准输出和错误都被重定向到文件。

如果更改为:命令21文件

21标准错误复制标准输出的行为,但此时标准输出仍在终端。在file之后,输出被重定向到file,但是标准错误仍然存在于终端中。

吸取的教训:

我计划每天晚上23:00定时在服务器上执行Python脚本,备份MySql数据库。该命令如下所示:

* 23 * * * python/var/www/html/crontab _ python/back _ db . py/dev/null 21

因此,每次备份都会生成60个备份文件。仔细检查调度任务命令,发现在“分钟”位置加了一个“0”,因为“*”代表这个位置的任意值。修改如下:

0 23 * * * python/var/www/html/crontab _ python/back _ db . py/dev/null 21

然后定期执行PHP脚本。

0 4 * * */usr/local/PHP/bin/PHP/usr/local/nginx/www/backup-db/backup _ db . PHP 172 . 16 . 8 . 26/dev/null 21

0 4 * * */usr/local/PHP/bin/PHP/usr/local/nginx/www/backup-db/backup _ db . PHP 172 . 16 . 10 . 151/dev/null 21

本文详细介绍了Crontab命令在Linux定时任务中的使用方法,并总结了Crontab命令的一些使用技巧和工作中遇到的一些问题的解决方法,希望对您有所帮助。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: