一、概述

本篇文章思维导图

Centos 怎么查看 crontab 的日志 linux 查看crontab任务执行情况_定时执行

1.1 crontab命令简介

有时候我们需要在linux系统中定时执行一些命令,比如说定时执行监控脚本来检测某个服务是否正常,不正常的话就把服务拉起,这个时候就会用到crontab命令了。
crontab命令,一般在Linux系统中用来设置被周期性执行的任务,将任务存放于crontab文件中。crontab命令依赖crond服务,只有安装了crond服务,crontab命令才能使用,一般在安装操作系统时,crond服务会被默认安装,并且会自动启动。crond进程每分钟会定期查看crontab文件中的任务列表检查是否有要执行的任务,如果有要执行的任务,则自动执行该任务。


操作

依赖

读取

crontab命令

crontab文件

crond服务


总结: 只有安装了crond服务以后crontab命令才能使用,crontab命令按照指定的格式编辑定时任务保存在crontab文件中,crond服务会每分钟定期查看crontab文件中的定时任务列表去执行任务。

1.2 linux定时任务分类

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

  • 系统任务调度:系统周期性所要执行的工作,比如写缓存数据到硬盘、日志清理等。在/etc目录下有一个crontab文件,这个就是系统任务调度的配置文件。
  • 用户任务调度:用户自定义的定期要执行的工作,用户可以使用 crontab 工具来定制自己的计划任务,所有用户自定义的crontab 文件都被保存在 /var/spool/cron目录中。其文件名与用户名一致,例如我用test用户设置了一个定时任务,那么其对应的crontab文件就是 /var/spool/cron/test。

总结:系统级别的定时任务crontab文件是/etc/crontab,用户自定义的定时任务其crontab文件保存在 /var/spool/cron/ 目录下,名字和用户名一致。

二、用法详解

2.1 crond服务安装

一般情况下crond服务在安装系统的时候会被默认安装,并自动运行。

centos7系统下检查服务是否安装

检查是否安装:systemctl status crond

如果显示 Unit crond.service could not be found.,则需要安装crond服务。

crond安装:yum -y install crontabs
启动crond服务: systemctl start crond
crond设置开机自启动: systemctl enable crond

2.2 crontab文件中的任务格式

前面说了用crontab命令可编辑定时任务,保存在crontab文件中,下面我们就来看一下定时任务的格式是什么样子的呢?
可以执行命令: cat /etc/crontab 看下示例:

[root@vm1 ~]# cat /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

文件前三行是用来配置crond任务运行的环境变量,第一行SHELL变量指定了系统要使用哪个shell,这里是bash,第二行PATH变量指定了系统执行命令的路径,第三行MAILTO变量指定了crond的任务执行信息将通过电子邮件发送给root用户,如果MAILTO变量的值为空,则表示不发送任务执行信息给用户。
我们重点关注一下最后一行:

*  *  *  *  * user-name  command to be executed

就是通过设置crontab文件中的这五个 * 来确定任务的执行时间的, user-name是执行任务的用户,command to be executed 是要执行的命令或者脚本任务,我们具体来看下这五个 * 所代表的含义。

项目

含义

取值范围

第一个*

一小时当中的第几分钟(minute)

0~59

第二个*

一天当中的第几小时(hour)

0~23

第三个*

一个月当中的第几天(day)

1~31

第四个*

一年当中的第几个月(month)

1~12

第五个*

一周当中的星期几(week)

0~7(0和7都代表星期日)

举个例子:

20 23 * * *  root systemctl restart httpd

上面的格式就表示:每天的 23:20 都会定时重启一次apache服务。
那么如果我想某个任务每隔5分钟就执行一次,该怎么设置呢?
其实,除了*这个字符之外还有其他的特殊字符,用来满足不同的定时需求。

特殊符号

含义

举例说明

*(星号)

表示任何时间

例如: * 8 * * * ,表示每天8点的每一分钟都执行一次命令

,(逗号)

用逗号隔开表示该字段的取值

例如:10 8,10,12 * * * ,表示在每天的8:10,10:10,12:10都会执行一次命令

-(中杠)

表示两个整数之间的取值范围

例如:10 8 * * 1-3 ,表示每周一到周三的8:10 执行一次命令

/(正斜线)

表示间隔多久执行一次

例如: * /10 * * * * ,表示每隔10分钟就执行一次命令

2.3 crontab常用命令

了解了crontab文件的格式之后,我们看下怎么用crontab命令来编辑crontab文件。
crontab命令的基本格式如下:
crontab [选项]
crontab [选项] file
常用选项及功能

选项

功能

-u user

用来设定某个用户的 crontab 服务,例如 -u test 表示设置 test用户的 crontab 服务,此选项一般只有 root 用户有权限来运行

-e

编辑某个用户的 crontab 文件内容,如果不指定用户,则表示编辑当前用户的 crontab 文件

-l

显示某用户的 crontab 文件内容,如果不指定用户,则表示显示当前用户的 crontab 文件内容

-r

从 /var/spool/cron 删除某用户的 crontab 文件,如果不指定用户,则默认删除当前用户的 crontab 文件

-i

在删除用户的 crontab 文件时,给与确认提示

其实在实际使用中,设置 crontab 定时任务非常简单,切换到需要执行命令的用户,然后只需执行crontab -e命令,然后会打开一个空文件,然后输入想要定时执行的任务即可。

[test@vm1]# crontab -e
#进入 crontab 编辑界面。会打开Vim编辑你的任务
 */10 * * * *   /home/test/test.sh

编辑完保存之后,就会在 /var/spool/cron/ 目录生成一个名字叫test文件,这个文件就是test用户的crontab文件。

说明:在crontab [选项] file 命令中, file 指的是命令文件的名字,表示将 file 作为 crontab 的任务列表文件并载入 crontab,若在命令行中未指定文件名,则此命令将接受标准输入(键盘)上键入的命令,并将它们键入 crontab, 例如:crontab -u test /root/jobs.txt ,表示用/root/jobs.txt 这个文件中的任务列表载入crontab。

三、相关文件

3.1 crontab日志文件

想查看定时任务的执行情况,直接查看 /var/log/cron文件就可以了。

[root@vm1 log]# tail -500f /var/log/cron

3.2 crontab权限文件

如果你不想让某个用户拥有执行定时任务的权限,你可以用编辑 /etc/cron.deny文件来限制用户。

[root@vm1 log]# vim /etc/cron.deny
#把要限制的用户一行一个写在里面保存即可。
test

四、使用注意事项

4.1 优先使用crontab -e

编辑 /etc/crontab文件和使用crontab -e 命令都可以执行定时任务,/etc/crontab文件只有root用户才能编辑,如果非系统级别的配置,执行的只是个人用户的一些任务,应该优先使用crontab -e命令。
这里需要注意的是: /etc/crontab文件和使用crontab -e 命令稍微有些不同!
/etc/crontab 格式: * * * * * user-name command to be executed
crontab -e 格式: * * * * * command to be executed
可以看出crontab -e 比/etc/crontab格式中少了一个user-name,因此在使用crontab -e时,不要加入user-name选项了,不然会导致定时任务无法运行!

4.2 谨慎使用crontab -r命令

crontab -r 命令会删除用户在 /var/spool/cron 下的crontab文件,即该用户下所有的定时任务都会被删除。如果只是想删除某个定时任务,用crontab -e 命令编辑crontab文件删除某个任务即可。

4.3 定时任务不执行原因

定时任务设置的格式正确,手动执行也没问题,但是定时任务就是不执行,这种情况的出现,一般是由下面几个原因造成的。

  • crond服务未启动
    需要首先排查下crond服务是否启动,可使用systemctl status crond 命令查看,如果未启动,则启动即可。
  • 脚本无权限
    如果要执行脚本无权限,通过chmod命令加上权限即可。
  • 文件路径问题
    定时任务要执行的脚本中涉及文件路径时,一定要写全局路径,不能写相对路径。
    例如:
[test@vm1]# cat test.sh
#!/bin/bash
java -jar  /home/test/test.jar

在test脚本中一定要写test.jar 文件的全局路径。

  • 环境变量问题
    定时任务要执行的脚本要用到java或其他环境变量时,需要通过source命令引入环境变量。
    例如:
[test@vm1]# cat test.sh
#!/bin/bash
source /etc/profile
java -jar  /home/test/test.jar