摘要:介绍了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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。