技术&教程 < 首页
7 Jun

Linux下定时任务软件:crontab 命令用法介绍

By: Soil 0 COMMENTS

最近用到了比较多的自动执行代码,于是乎关于crontab的介绍和相关就看得比较多整理起来如下:

crontab是一个linux下的定时执行工具,可以在无需人工干预的情况下运行作业。Crontab是内置程序,基本任何版本的Linux都带有这个程序,包括Ubuntu。

1.crontab命令选项:
-u指定一个用户,
-l列出某个用户的任务计划,
-r删除某个用户的任务,
-e编辑某个用户的任务

2.cron配置文件(文件位置:/etc/crontab)语法:
分      小时   日       月       星期     命令
0-59   0-23   1-31   1-12     0-6     command     (取值范围,0表示周日一般一行对应一个任务)

3.记住几个特殊符号的含义:
“*”代表取值范围内的数字,
“/”代表”每”,
“-”代表从某个数字到某个数字,
“,”分开几个离散的数字

4.配置文件的写法
可以使用crontab -e命令来编辑,也可以直接修改/etc/crontab文件
具体格式如下:
Minute Hour Day Month Dayofweek   command
分钟      小时   天        月       天每星期       命令
每个字段代表的含义如下:
Minute             每个小时的第几分钟执行该任务
Hour               每天的第几个小时执行该任务
Day                 每月的第几天执行该任务
Month             每年的第几个月执行该任务
DayOfWeek     每周的第几天执行该任务
Command       指定要执行的程序
在这些字段里,除了“Command”是每次都必须指定的字段以外,其它字段皆为可选字段,可视需要决定。对于不指定的字段,要用“*”来填补其位置。
举例如下:
5           *          *            *        *      ls             指定每小时的第5分钟执行一次ls命令
30        5          *            *        *      ls             指定每天的 5:30 执行ls命令
30        7          8           *        *      ls             指定每月8号的7:30分执行ls命令
30        5          8           6        *      ls             指定每年的6月8日5:30执行ls命令
30        6          *            *        0      ls             指定每星期日的6:30执行ls命令[注:0表示星期天,1表示星期1,以此类推,也可以用英文来表示,sun表示星期天,mon表示星期一等。]
30        3          10,20    *       *      ls     每月10号及20号的3:30执行ls命令[注:“,”用来连接多个不连续的时段]
25        8-11    *             *       *      ls       每天8-11点的第25分钟执行ls命令[注:“-”用来连接连续的时段]
*/15    *           *             *       *      ls         每15分钟执行一次ls命令 [即每个小时的第0 15 30 45 60分钟执行ls命令 ]
30       6           */10      *       *      ls       每个月中,每隔10天6:30执行一次ls命令[即每月的1、11、21、31日是的6:30执行一次ls命令。 ]
50       7           *             *       *     root     run-parts     /etc/cron.daily   每天7:50以root 身份执行/etc/cron.daily目录中的所有可执行文件[ 注:run-parts参数表示,执行后面目录中的所有可执行文件。

下面是Linux 上crontab手册中的知识点:

1. crontab文件“正式行”的开始

空行、以空格或者“tab”开行的行,被cron(daemon)忽略。

以#开始的行,作为注释被cron(daemon)忽略。

“注释”不允许与“命令”放在同一行(作为命令的注释),会被作为“第六段”,被cron(daemon)执行。

同样的,也不能放在设置环境变量的同一行。

2. 在crontab文件中指定环境变量

设置变量使用

name = value

这样的格式,”=”号左右的空格不是必须的。

几个变量默认已经被设置,比如:

SHELL=/bin/sh
HOEM=/home/nnix
LOGNAME=nnix

其中SHELL和HOME可以重新设定,LOGNAME则不可(大概跟确定crontab文件的位置有关)。

默认,crontab会把执行的输出发送给crontab的所有者,除非重新设定变量:

MAILTO=other_or_email

另外,当crontab发送输入时的邮件编码,可以通过设置变量 CONTENT_TYPE 和 CONTENT_TRANSFER_ENCODING 来使用正确的编码来发送邮件。

3. crontab 文件的分段

依次分别是

  • 分(0-59)
  • 时(0-23)
  • 日(1-31)
  • 月(1-23,或者英文名)
  • 周(0-7,或者英文名,0和7均表示周日)
  • 要执行的内容

4. 前五段:时间和日期

1)表示任意:* 号表示 “任意”(first-last)。

2)指定数字,表示指定的时间。

3)指定段,表示“开始-结束”内包含的数:比如3-6,表示3,4,5,6

4)指定列表:比如 “1,2,3,4″,”0-4,8-12″

5)指定“步长”:8-14/2 表示8,10,12,14

5. 模糊的第六段:

1)除去前五段,从第六段开始到换行符或者“%”为止,为要执行的命令。

2)默认第六段将被/bin/sh执行,除非在crontab文件中指定了非/bin/sh的SHELL变量。

3)第六段中的”%”号,除非前面加”\”号转交,否则,“%”号将结束命令行、换行的意义,并且其后的内容会被做为标准输入发送给前面的命令。

6. 冲突的逻辑

日期可以用月限定,也可以用“星期”指定,如果两个段有冲突(比如这两段不同时为“*”),那么,第六段的命令将在匹配任何一个的情况下运行,比如

“30 4 1,15 * 5″,将在每月的1号和15号 加 每个周五,上午4:30运行。

7. crontab文件中的神密符号“%”

可能会遇到的一个问题是,在第六段中需要使用date生成日志文件名,比如:

0   4   *   *   *   /opt/cron/mysql_dump.sh    > /srv/logs/`date +%y-%m-%d`.dump.log

这时会发现crontab怎么也不运行这个mysql_dump.sh,也看不到有日志生成。这是因为在crontab文件中,”%”是有特殊含义 的。假如不需要“%”的特殊作用,需要使用转义符转义。上面应该写成:

0   4   *   *   *   /opt/cron/mysql_dump.sh    > /srv/logs/`date +\%y-\%m-\%d`.dump.log

“%”在crontab文件中,有“结束命令行”、“换行”、“重定向”的作用,比如:

0  22  * * 1-5  mail -s “It’s 10:00 pm” joe%Joe,%%Where are your kids?%

将会在周一至周五的22:00发送一分内容为:

Joe,<换行>
<换行>
Where are your kids?<换行>

8. 不能理解的特殊用法

@reboot    :    Run once, at startup.

为了达到在开机后运行,且只运行一次的目的,除了这个,恐怕无法通过前五段的设置来实现吧?

本文地址:http://cms.xisix.com:8880/post-7.html

添加新评论