linux命令大全之crontab命令使用详解

at命令是一个例行计划任务,运行一次,并在由cron(crond)系统服务控制的Linux系统循环中运行。
Linux系统上有很多计划任务,所以这些系统服务都是默认启动的。
另外,由于用户还可以自己设置定时任务,因此Linux系统还提供了一个命令供用户控制定时任务:crontab命令。

1.crond简介

crond是Linux下的一个守护进程,用于定期执行某些任务或等待Windows处理某些事件。
操作系统安装后,会默认安装这个服务工具,并且会自动启动crond进程,自动执行任务。

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

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

/etc/crontab文件包含以下几行:

复制代码

代码如下:

复制代码

代码如下:

[root@localhost~]#cat/etc/crontab

SHELL=/bin/bash

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

MAILTO=""HOME=/

#run-parts

51****rootrun-parts/etc/cron.hourly

247***rootrun-parts/etc/cron.daily

224**0rootrun-parts/etc/cron.weekly

4241**rootrun-parts/etc/cron.monthly

[root@localhost~]#

前四行用于配置crond任务的环境变量SHELL第一行该变量指定要使用的系统shell,这是bash第二行PATH变量指定系统执行命令的路径第三行MAILTO变量指定执行crond任务的信息将通过电子邮件发送给root用户。
如果MAILTO变量的值为空,则表示不会将任务执行信息发送给用户。
第四行中的HOME变量指定执行命令或脚本时使用的主目录。
第六行到第九行所代表的含义将在下一节中详细解释。
这里不多说。
用户任务调度:用户经常执行的任务,如用户数据备份、定期邮件提醒等。
用户可以使用crontab工具自定义自己的计划任务。
所有用户定义的crontab文件都存储在/var/spool/cron目录中。
文件名与用户名一致。

用户授权文件:

文件:

复制代码

代码如下:

/etc/cron.deny

注意:

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

文件:

回复创建代码

代码就像如下:

/etc/cron.allow

说明:

此文件中列出的用户允许使用crontab命令

文件:

复制代码

代码如下:

/var/spool/cron/

描述:

存储所有以用户名命名的用户crontab文件的目录

含义crontab文件:

在用户创建的crontab文件中,每一行代表一个任务,每行中的每个字段代表其格式设置,分为六个字段。
前五段是计时段,第六段是要执行的命令段格式如下:

复制代码

代码如下:

minithourdaymonthweekcommand

其中:

month:代表分钟,可以是任意0到59之间的整数。

Hour:表示小时,可以是0到23之间的任意整数。

day:表示日期,可以是1到10之间的任意整数。
31.

Month:表示月份,可以是1到12之间的任意整数。

week:表示星期几,可以是0到7之间的任意整数,其中0或7代表星期日。

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

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

星号(*):代表所有可能的值​​例如,如果月份字段是星号,则表示满足其他字段约束后,每月执行此命令。

逗号(,):可以使用逗号分隔值来定义列表范围,例如“1,2,5,7,8,9”

中条(-):可以在整数之间使用中条来表示整数范围的数字,例如“2-6”表示“2,3,4,5,6”

正斜杠(/):可以使用正斜杠向前指定间隔频率,如“0-23/2”意思是每两个小时执行一次。
同时,正斜杠可以与星号一起使用,如*/10,如果用在分钟字段中,则表示每十分钟执行一次。

2.crond服务

安装crontab:

复制代码

代码如下:

yuminstallcrontabs

服务运行命令:

/sbin/servicecrondstart//启动服务

/sbin/servicecrondstop//关闭向下service

/sbin/servicecrondrestart//重启服务

/sbin/servicecrondreload//重新加载配置

查看crontab服务状态:

servicecrondstatus

手动启动crontab服务:

servicecrondstart

检查crontab服务是否设置为on启动计算机并运行命令:ntsysv

添加当前自动启动boot:

复制代码

代码如下:

chkconfig–level35crondon

3。
crontab命令详细解释

1.命令格式:

复制代码

代码如下:

crontab[-user]file

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

2.命令功能:

通过crontab命令,我们可以定时执行某些系统命令或者shellscript。
时间间隔单位可以是分钟、小时、天、月、周或以上的任意组合。
该命令非常适合定期日志分析或数据备份等任务。

3.命令参数:

-user:用于设置特定用户的crontab服务,例如“-uixdba”表示设置用户ixdba的crontab服务。

file:file是命令文件的名称,表示该文件作为crontab任务列表文件,加载到crontab中。
如果未在命令行上指定此文件,则crontab命令将接受在标准输入(键盘)上键入的命令并将其加载到crontab中。

-e:编辑用户的crontab文件的内容。
如果没有指定用户,则意味着编辑当前用户的crontab文件。

-l:显示特定用户的crontab文件内容如果不指定user,则表示显示当前用户的crontab文件内容。

-r:从/var/spool/cron目录中删除用户的crontab文件如果不指定用户,则默认删除当前用户的crontab文件。

-i:删除用户crontab文件时给出确认提示。

4.常用方法:

1).创建一个新的crontab文件

在考虑向cron进程提交crontab文件之前,需要注意以下事项:首先要做的是设置EDITOR环境变量。
cron进程使用它来确定使用哪个编辑器来编辑crontab文件。
99%的UNIX和LINUX用户使用vi如果您是这种情况,请编辑$HOME目录中的.profile文件并添加以下行:

EDITOR=vi;exportEDITOR

然后保存出来您还可以创建一个名为usercron的文件,其中user是用户名,例如davecron。
将以下内容添加到该文件中。

复制代码

代码如下:

#(putyourownitalshere)echothedatetotheconsoleevery

#6pm和6am之间15分钟

0,15,30,4518-06***/bin/echo'date'/dev/console

保存并退出。
确保前5个字段以空格分隔。

在上面的例子中,系统每隔15分钟就会向控制台输出一次当前时间。
如果系统崩溃或挂起,显示的最后时间将一目了然地告诉您系统是否损坏、何时停止工作?有些系统中用tty1来代表控制台,上面的例子可以根据实际情况做相应修改。
要提交刚刚创建的crontab文件,可以使用这个新创建的文件作为cron命令参数:

复制代码

代码如下如下:

$crontabdavecron

现在文件已提交到cron进程,该进程每15分钟运行一次。

同时,新创建的文件副本已放置在/var/spool/cron目录中,文件名是用户名(即dave)。

2)。
列出crontab文件

要列出crontab文件,可以使用:

复制代码

代码如下:

$crontab-l

0,15,30,45,18-06***/bin/echo`date`dev/tty1

你会看到与上面类似的东西。
可以用这种方法备份$HOME目录下的crontab文件:

复制代码

代码如下:

$crontab-l$HOME/mycron

这样一旦不小心删除了crontab文件,就可以使用上一节介绍的方法快速恢复。

3).编辑crontab文件

如果要在crontab文件中添加、删除或编辑条目,并且EDITOR环境变量设置为vi,则可以使用vi编辑crontab文件,对应的命令为:

复制代码

代码如下:

$crontab-e

你可以修改crontab文件并退出,就像使用vi编辑任何其他文件一样。
如果修改了某些条目或添加了新条目,cron将在保存文件时对文件执行必要的完整性检查。
如果其中一个字段的值超出允许范围,它会提示您。

当我们编辑crontab文件时,我们可能会添加新条目。
例如添加以下内容:

复制代码

代码如下:

#DT:deletecorefiles,at3。
30amon1,7,14,21,26,26harisofeachmonth

3031,7,14,21,26**/bin/find-name"core'-execrm{}/;

现在保存并退出最好使用crontab为Explanation文件中的每个条目添加注释,这样您就可以知道它做了什么,什么时候运行,更重要的是,哪个用户任务

现在让我们使用前面提到的crontab-l命令列出:

复制代码

代码如下:

$crontab-l

#(crondaveinstalledonTueMei413:07:431999)

#DT:echthedatetotheconsoleevery30minites

0,15,30,4518-06***/bin/echo`date`/dev/tty1

#DT:deletecorefiles,at3.30amon1,7,14,21,26,26daily月

3031,7,14,21,26**/bin/find-name"core'-execrm{}/;

4).删除crontab文件

要删除crontab文件,可以使用:

复制代码

代码如下:

$crontab-r

5).恢复丢失的cro文件ntab

如果你不小心删除了crontab文件,假设你的$HOME目录下还有备份,你可以将它复制到/var/spool/cron/username,其中username就是用户名。
如果由于权限问题无法完成复制,可以使用:

复制代码

代码如下:

$crontabfilename

其中,文件名为$HOME目录中的副本名称。

我建议您在$HOME目录中保留此文件的副本,我也有过同样的经历,并且多次意外删除了crontab文件。
键旁边是右键e)。
这就是为什么一些系统文档建议不要直接编辑crontab文件,而是编辑该文件的副本,然后重新提交新文件。

crontab的一些变体非常奇怪,因此使用crontab命令时要小心。
如果省略任何选项,crontab可能会打开一个空文件,或者看起来是一个空文件。
这时按删除键退出不要按Ctrl-D,否则会丢失crontab文件。

5.使用示例

示例1:每1分钟执行一次命令

命令:

*****命令

示例2:每小时第3、15分钟执行

命令:

3,15****com命令

示例3:执行上午8点到第3分钟和第15分钟上午11点

命令:

3,158-11***命令

示例4:早上8点到11点每两点的第3、15分钟执行days

命令:

3,158-11*/2**命令

例5:每周一第3、3分钟15点执行上午8点到上午11点

命令:

3,158-11**1命令

示例6:每天晚上21点:30重新启动smb

命令:

3021***/etc/init.d/smbrestart

示例7:每月1日、10日、22日4:45重启smb

命令:

4541,10,22**/etc/init.d/smbrestart

例8:每周六凌晨1点10分重启smb,周日

命令:

101**6,0/etc/init.d/smbrestart

示例9:每30分钟重启一次smb每天18:00和23:00

使用说明:

0,3018-23***/etc/init.d/smbrestart

示例10:每周六晚上11:00重新启动smb

命令:

023**6/etc/init.d/smbrestart

示例11:重新启动每小时smb

命令:

**/1***/etc/init.d/smbrestart

示例12:晚上11点至晚上11点之间每小时重新启动smb7am

命令:

*23-7/1***/etc/init.d/smbrestart

示例13:在每月4日和11点每周一至周三

命令:

0114*mon-wed/etc/init.d/smbrestart

示例14:1月1日4点重启smb

命令:

041jan*/etc/init.d/smbrestart

示例15:每次运行/etc/cron.hourly目录下的脚本每小时

命令:

01****rootrun-parts/etc/cron.hourly

说明:

参数run-部分,如果去掉这个参数,则可以写出要执行的脚本名称,而不是目录名称

四使用注意事项

1.注意问题变量环境

有时候我们创建了一个crontab,但是任务无法执行自动执行,但手动执行任务时没有问题这种情况一般是环境变量导致的no在生成的crontab文件中配置。

在crontab文件中定义多个调度任务时,需要特别注意的一个问题是环境变量的设置,因为当我们手动执行任务时,都是在当前的shell环境中完成的。
程序的环境变量是可以找到的,但是系统自动执行任务调度时,不会加载任何环境变量,因此需要在crontab文件中指定运行任务所需的所有环境变量,系统启动时没有问题执行任务调度。

不要假设cron知道它需要的特殊环境,它不知道。
因此,您需要确保在shelll脚本中提供所有必要的路径和环境变量,除了一些自动设置的全局变量。
因此,要注意以下三点:

1)当脚本中涉及文件路径时,写全局路径

2)当脚本的执行需要java时或者其他环境变量,通过source命令引入,如:

复制代码

代码如下:

catstart_cbp.sh

#!/bin/sh

源/etc/profile

exportRUN_CONF=/home/d139/conf/platform/cbp/cbp_jboss.conf

/usr/local/jboss-4.0.5/bin/run。
sh-cmev

3)手动执行脚本时可以,但crontab不执行。
此时,你一定强烈怀疑是环境变量惹的祸,可以尝试在crontab中直接引入环境变量来解决问题。
例如:

复制代码

代码如下:

0****./etc/profile;/bin/sh/var/www/java/audit_no_count/bin/restart_audit.sh

2.注意清除系统用户邮件日志

每个任务调度完后执行完毕后,系统会通过邮件的方式将任务输出信息发送给当前系统用户,随着时间的推移,日志信息会非常大,会影响系统的正常运行,因此对每个任务进行重定向非常重要。

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

0*/3***/usr/local/apache2/apachectlrestart/dev/null21

“/dev/null21”表示先将标准输出重定向到/dev/null,然后将标准错误重定向到标准输出由于标准输出被重定向到/dev/null,所以标准错误是也会被重定向到/dev/null,所以问题日志输出已解决。

3.系统级任务调度和用户级任务调度

系统级任务调度主要完成一些系统维护操作,用户级任务调度完成大部分用户定义的任务。
可以将用户级任务调度放到系统级任务调度中(不推荐),但否则无法由root用户进行操作,可以通过“crontab-uroot-e”进行设置,也可以将定时任务直接写入/etc/crontab文件请记住,如果要定义一个频繁重启系统的任务,就必须将该任务放在/etc/crontab文件中,即使是在root用户下创建一个频繁重启系统的任务,将会无效。

4.其他说明

新创建的cronjobs不会立即执行。
执行至少需要2分钟。
如果cron重新启动,它将立即执行。

当crontab突然失败时,可以尝试/etc/init.d/crondrestart来解决问题。
或者查看日志看作业是否执行/报错tail-f/var/log/cron.

切勿随机运行crontab-r。
它从Crontab目录(/var/spool/cron)中删除用户的Crontab文件。
删除用户后,所有crontab都消失了。

在crontab中,%有特殊含义,表示换行符。
如果要使用它,必须转义/%。
例如,经常使用的日期'+%Y%m%d'将不会在crontab/%d'中执行。