Last Updated on

前言

就像再windows上有计划任务一样,centos7 自然也有计划任务,而且设置更为灵活好用。在centos7 上可以利用系统自带默认运行着的服务crond,通过配置crontab来配置执行计划任务。crond命令每分锺会定期检查是否有要执行的工作,如果有要执行的工作便会自动执行该工作。

非常简单方便,是centos7上基本必须了解知道的东西,下面我就详细记录介绍cron的使用。

正文

1. 确认服务运行

首先确认服务是运行着的,如果关了请启动

# 启动crond服务
$ systemctl start crond

# 设为开机启动
$ systemctl enable crond

# 查看状态
$ systemctl status crond

2. 配置定时任务

定时任务的配置方法,都是通过编写配置文件进行配置的。但配置文件又分为两类:

  • 用户的配置,根据用户进行区分的用户级别的配置文件
  • 系统配置,统一的全局配置文件

下面就说明一下这两种配置文件的配置方式。

用户配置

# 编辑用户的定时任务,指定执行的用户
# -u 指定用户,不加默认为当前用户
$ crontab -e -u {user}

# 列出某个用户cron服务的详细内容
$ crontab -l -u {user}

# 删除某个用户的cron服务
$ crontab -r -u {user}

使用命令编辑用户的定时任务,会打开此用户的配置文件,开始是空的文件,然后就是在此文件中配置定时任务,配置完后生成的配置文件目录为: /var/spool/cron/ ,在此目录下就可以看到以用户名命名的配置文件。

之前配置文件中,该如何配置,下面统一详解。

系统配置

除了上面用户配置,还有一个系统的全局配置,配置文件为:/etc/crontab 。此文件可以直接定义定时任务,但前提是有root权限才能修改。

# 编辑系统配置,文件默认内容如下
$ vim /etc/crontab
------------------------------------------------------------------
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name  command to be executed
------------------------------------------------------------------

3. 配置语法

上面说明了两种配置方式,但两种配置方式都是需要通过定义配置来实现定时任务的,那这配置该如何写呢,其实在系统配置文件中,默认的内容就有提示:

Example of job definition:
 .---------------- minute (0 - 59)
 |  .------------- hour (0 - 23)
 |  |  .---------- day of month (1 - 31)
 |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr …
 |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
 |  |  |  |  |
 *  *  *  *  * user-name  command to be executed

# 格式就是最下面一行的这个,意思明显,从头到尾,分别如下:
分钟 小时 天 月 周  用户名     需要执行的命令
 *  *  *  *  * user-name  command to be executed


根据此格式,举例说明,根据举例,自行编写自己的定时任务配置即可。

# 每天,每30分钟执行一次 mycommand命令,这需要此文件具有可执行权限。
*/30 * * * * root /usr/local/mycommand.sh
 
# 每天凌晨三点的每一分钟,都执行命令脚本
# PS:这里由于第一个的分钟没有设置,那么就会每天凌晨3点的每分钟都执行一次命令 
* 3 * * * root /usr/local/mycommand.sh

# 这样就是每天凌晨三点整执行一次命令脚本
00 3 * * * root /usr/local/mycommand.sh
 
# 每天11点到13点之间,每10分钟执行一次命令脚本,这一种用法也很常用
*/10 11-13 * * * root /usr/local/mycommand.sh
 
# 每小时的10-30分钟,每分钟执行一次命令脚本,共执行20次
10-30 * * * * root /usr/local/mycommand.sh

# 每小时的10,30分钟,分别执行一次命令脚本,共执行2次
10,30 * * * * * root /usr/local/mycommand.sh

# 每周一至周五,半夜3点执行一次命令脚本
00 3 * * 1-5 root /usr/local/mycommand.sh

# 从1月到6月,每月的10-20号,每天的10点到12点,每30分钟执行一次。
*/30 10-12 10-20 1-6 * root /usr/local/mycommand.sh

# 每隔一天的凌晨执行一次命令
00 00 */2 * * root /usr/local/mycommand.sh

OK,上面就是配置的语法,但需要特别注意几点

  • cron 的任务计划, 并不会调用用户设置的环境变量,而是只会使用shell的基础环境变量。
  • cron 不方便执行语句繁多的任务,常用推荐是写成shell脚本或python脚本进行执行。
  • 执行脚本文件时,此文件必须具有可执行权限。

另外,执行的计划任务,日志在 /var/log/cron 中可以查看执行日志,以供分析查看。

结束

OK,到此就记录介绍完了crond服务并利用其实现定时计划任务。这中方式可以运用在小的临时的定时任务安排上,而对于管理大量服务器的情况下,则需要有一个运维平台,此运维平台来集中调度执行你所有的计划任务,当然啦这也是中大型互联网公司所必有的平台,现在这里开个坑,后面在更新python相关文章时,会以运维平台为例,系统的记录介绍实现自己的运维平台。

好啦,有任何问题,欢迎留言。