crontab命令-定时任务

crontab是英文“cron table”的[[缩写|简写]]。该命令被用来提交和管理用户的需要周期性执行的任务,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务工具,并且会自动启动crond进程,crond进程每分钟会定期检查是否有要执行的任务,如果有要执行的任务,则自动执行该任务。

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

系统任务调度:系统周期性所要执行的工作,比如写缓存数据到硬盘、日志清理等。/etc/crontab文件是系统任务调度的配置文件。用户任务调度:用户定期要执行的工作,比如用户数据备份、定时邮件提醒等。用户可以使用 crontab 工具来定制自己的计划任务。所有用户定义的crontab 文件都被保存在 /var/spool/cron目录中。其文件名与用户名一致。

语法格式:crontab [参数]

常用参数:

参数
描述

-e

编辑该用户的计时器设置

-l

列出该用户的计时器设置

-r

删除该用户的计时器设置

-u

指定要设定计时器的用户名称

--help

显示帮助信息

参考实例

创建、编辑计划任务:

 crontab -e  

查看当前计划任务:

 crontab -l 

删除所有计划任务:

 crontab -r 

在正式部署计划任务前,我们了解一下使用crond服务设置任务的参数格式( 需要注意的是,如果有些字段没有设置,则需要使用星号(*)占位 ):

minute hour day month week command 顺序:分 时 日 月 周 命令 使用crond设置任务的参数字段说明:

minute 表示分钟,是从0到59之间的任何整数 hour 表示小时,是从0到23之间的任何整数 day 表示日期,是从1到31之间的任何整数 month 表示月份,是从1到12之间的任何整数 week 表示星期,是从0到7之间的任何整数,其中0或7代表星期日 command 要执行的命令,可以是系统命令,也可以是自己编写的脚本文件 每周一、三、五的凌晨3点25分,使用tar命令把某个网站的数据目录进行打包处理,使其作为一个备份文件。我们使用crontab -e命令来创建计划任务。为自己创建计划任务无需使用-u参数,具体的实现效果的参数如crontab -l命令结果所示:

crontab -e 
no crontab for root - using an empty one 
crontab: installing new crontab 

crontab -l 
25 3 * * 1,3,5 /usr/bin/tar -czvf backup.tar.gz /home/wwwroot

# 每5分钟
*/5 * * * * 

# 周一到周五
* * * * 1-5

# 每月最后一天
* * 28-31 * * [`date -d tomorrow +\%e` -eq 1] && do something 

~~* * L * * do something ~~ # 每月倒数第二天,其它天数可依此类推 * * L-1 * * do something

root用户添加以其它用户执行的定时任务,有两种方式,

# 指定用户,会切换到该用户下的crontab
crontab -e -u username

# 以当前用户添加,但实际执行用户是username
crontab -e
	* * * * * username command

其中问号(?)只能用在DayofMonth和DayofWeek两个域,由于指定日期(DayofMonth)和指定星期(DayofWeek)存在冲突,所以当指定了日期(DayofMonth)后(包括每天*),星期(DayofWeek)必须使用问号(?),同理,指定星期(DayofWeek)后,日期(DayofMonth)必须使用问号(?)。


crontab的另外一种写法

# 常见写法
0 * * * * sh filename.sh

# 另一种写法
@hourly sh filename.sh

格式解释:

  • @reboot:在系统启动时运行一次

  • @yearly:每年运行一次

  • @annually:也是每年运行一次

  • @monthly:每月运行一次,“0 0 1 * *”

  • @weekly:每周运行一次,“0 0 * * 0”

  • @daily:每天“0 0 * * *”

  • @midnight:同上,每天

  • @hourly:每小时"0 * * * *"


crontab 默认是 nano 编辑器,不好用,将 crontab 改为 vim 编辑器

直接定义变量指定 crontab 为 vim 编辑器

export EDITOR="/usr/bin/vim" ; crontab -e

或使用更简单的方式,直接从重新指定 crontab 的默认编辑器,执行以下命令,选择对应编辑器的编号即可

select-editor
	Select an editor.  To change later, run 'select-editor'.
	  1. /bin/nano        <---- easiest
	  2. /usr/bin/vim.basic		# vim
	  3. /usr/bin/vim.tiny		# vi
	  4. /bin/ed

记一次crontab问题排查

一次在查看cron日志文件时,发现有一个定时任务执行不成功的日志记录。经查看, 该执行文件已重命令,而且也通过crontab -e 命令删除了对应的任务。但发现仍然会按之前的定时任务配置继续执行。通过crontab -l 无法看到相应的定时任务配置,查看/etc/crontab文件中也没有相应的配置。最后抱着尝试的心态看一看cron的配置文件,结果发现在/etc/下有一个cron.d目录,ntpd服务用于定时同步时间的配置在这个目录下以文件形式存在。再一看那个通过crontab -e删除的任务赫然也在。移除该文件后定时任务终于彻底不再继续执行


cron运行时,top的输出被截断为80字符宽

有时在脚本中使用top命令时,配置为定时任务输出内容到指定文件会发现输出内容长度不完整。 可以在定时任务的时间后面加上COLUMNS=9999来设置输出内容显示宽度

* * * * * COLUMNS=9999 /tmp/top.sh

最后更新于