Linux定时任务之crond/crontab

时间:2022-06-06 21:40:29

定时任务,顾名思义即固定一段时间执行一次某任务。
例如手机设置的闹钟、定时开关机等都属于定时任务,那么Linux要如何设置定时任务呢?

crontab

首先认识crontab,该词来源于希腊语chronos(χρόνος),原意是时间。
它是一个命令,常见于Unix和类Unix的操作系统之中,用于设置周期性被执行的指令。
该命令从标准输入设备读取指令,并将其存放于“crontab”文件中,以供之后读取和执行。

crond

crond,与crontab是不可分割的,是crontab的守护进程。

守护进程(daemon)

它是一类在后台运行的特殊进程,用于执行特定的系统任务。
很多守护进程在系统引导的时候启动,并且一直运行直到系统关闭;另一些只在需要的时候才启动,完成任务后就自动结束。

crontab file的格式
crontab文件中的行由6个字段组成,如下图所示:

Linux定时任务之crond/crontab

其中各项格式如下:
1. 分钟:0-59,表示分钟数与给出值相等时执行任务
2. 小时:0-23,表示小时数与给出值相等时执行任务
3. 日期:1-31,含义同上
4. 月份:1-12,含义同上
5. 周几:0-6,含义同上,其中数值为0时表示周日
6. 执行内容:即在shell命令行中能运行的命令

crontab file格式中的特殊符号
1. * ——星号,代表当前值为允许范围内的所有值,如第一个字段为*表示每一分钟都执行任务,即每个都、全部的意思
2. - ——减号,代表一段区间,如第一个字段为1-3表示1、2、3分钟执行任务
3. ,——逗号,代表一些值的集合,如第一个字段为1,2,4表示1、2、4分钟执行任务
4. /n ——n代表数值,如第一个字段为/3表示每3分钟执行一次任务

crontab的帮助信息
在命令行中敲入“crontab -h”命令查看crontab的帮助信息,如下:

Usage:
crontab[options] file
crontab[options]
crontab -n [hostname]

Options:
-u <user> define user(确定用户,如普通用户、root)
-e edit user's crontab(编辑用户的定时任务)
-l list user's crontab(查看用户的定时任务)
-r delete user's crontab(删除用户的定时任务)
-i prompt before deleting(删除之前进行提示)
-n <host> set host in cluster to run users' crontabs(在簇中设置运行用户定时任务的主机,小编还没完全搞懂见谅哈O(∩_∩)O,欢迎各位大神指导!)
-c get host in cluster to run users' crontabs(获取在簇中运行用户定时任务的主机)
-s selinux context
-x <mask> enable debugging

本文介绍前五个较为常用的选项。
1. -l

-l选项默认情况下打印当前用户的定时任务内容,通过下面的两组操作即能证明。 如下图:

Linux定时任务之crond/crontab
图1 普通用户的定时任务内容

当切换为超级用户root后,结果如下:
Linux定时任务之crond/crontab
图2 超级用户的定时任务内容

如上,同样的命令,在不同的用户下结果显然不同,故而-l命令默认情况下打印当前用户的定时任务。

2.-u

那么-l显然不能满足我们的需求,当需要查看其它用户的定时任务时,切换显得尤为麻烦。此时-u的作用就体现出来了,话不多说直接上图:

Linux定时任务之crond/crontab
图3 -u选项的应用

显然,结果与图1相同,即成功打印了用户jing的定时任务。
那么普通用户是否可以查看超级用户的任务呢?显然是不能的,也不应该能。
Linux定时任务之crond/crontab
图4 普通用户尝试访问超级用户的定时任务(失败)

如上图,系统打印出“必须拥有对-u指向用户的特权”,即被该用户允许才可读取其定时任务。

3.-e

-e选项实现了当前用户定时任务的编辑功能,默认使用vim编辑器,可以通过更改配置文件进行更改。
假设,我们需要将当前时间打印在终端上,为了测试方便,所有时段均设为*值;将要执行的代码写在文件test.c中,内容如下:

Linux定时任务之crond/crontab
图5 要执行的代码内容

生成可执行文件后,其绝对路径为/home/jing/Code/pts_study/test,将其结果重定向到终端8的屏幕上,代码如下:
Linux定时任务之crond/crontab
图6 普通用户定时任务代码

保存退出后可看到如下提示,即为定时任务添加成功:
Linux定时任务之crond/crontab
图7 添加成功提示

显然,有时这种方法也不够方便,还有一种添加定时任务的方法,是将命令写入文件,执行crontab file即可添加成功,添加如下:
Linux定时任务之crond/crontab
图8 写在文件中的命令

上述任务表示每分钟将当前date(日期)输出重定向至7号终端,并将该date输出重定向至指定路径下的date.txt文件。
之前我们已经在用户jing中添加了一项定时任务(如图6所示):每分钟在8号终端上执行test文件,其中test文件将输出当前终端的0、1、2号文件描述符所指向的内容,即stdin、stdout和stderr;
现在再在超级用户中添加上述任务文件。
一段时间后分别观察7、8号终端情况以及date.txt文件内容如下:
Linux定时任务之crond/crontab
图9 8号终端输出情况
Linux定时任务之crond/crontab
图10 7号终端输出情况
Linux定时任务之crond/crontab
图11 date.txt文件内容

4.-r

-r表示删除定时任务,默认为当前用户的。
如下图所示,首先执行crontab -l命令,查看当前用户的定时任务,而后-r选项进行删除,最终再次-l查看,显示“no crontab for jing”,即用户jing已无定时任务,删除成功!

Linux定时任务之crond/crontab
图12 定时任务的删除

5.-i

-i表示在删除任务之前进行提示,输入y表示确认删除,n表示取消,如下图所示:

Linux定时任务之crond/crontab
图13 -i选项的使用方法