crontab --定时执行任务

时间:2022-08-08 07:55:35

在工程项目中,难免需要用到一些定时执行的任务。对于java这种常驻内存的语言,比较容易解决,java自身就提供了定时任务,而且还有优秀的第三方开源工具quartz。但是像php、python这样脚本语言,定时任务就需要借助于操作系统的定时任务管理。不过python也有一个优秀的第三方开源插件celery完成定时任务的执行。这里我们就看一下linux操作系统定时任务管理器crontab的使用。

 

crontab命令用于设置周期性被执行的指令。该命令从标准输入设备读取指令,并将其存放于“crontab”文件中,以供之后读取和执行。

cron 系统调度进程。 可以使用它在每天的非高峰负荷时间段运行作业,或在一周或一月中的不同时段运行。cron是系统主要的调度进程,可以在无需人工干预的情况下运行作业。crontab命令允许用户提交、编辑或删除相应的作业。每一个用户都可以有一个crontab文件来保存调度信息。系统管理员可以通过cron.deny 和 cron.allow 这两个文件来禁止或允许用户拥有自己的crontab文件。

一、认识crond服务

    1、crond是Linux用来定期执行程序的命令。当安装完成操作系统之后,默认便会启动此任务调度命令。crond命令每分锺会定期检查是否有要执行的工作,如果有要执行的工作便会自动执行该工作。而Linux任务调度的工作主要分为以下两类:

  ①系统执行的工作:系统周期性所要执行的工作,如备份系统数据、清理缓存

  ②个人执行的工作:某个用户定期要做的工作,例如每隔10分钟检查邮件服务器是否有新信,这些工作可由每个用户自行设置

 2、Crontab是UNIX系统下的定时任务触发器,其使用者的权限记载在下列两个文件中:

  ①/etc/cron.deny 该文件中所列的用户不允许使用Crontab命令

  ②/etc/cron.allow 该文件中所列的用户允许使用Crontab命令

 3、/var/spool/cron/ 是所有用户的crontab文件

   4、启动、停止、查看crond服务:

    ①启动:service crond start

    ②停止:service crond stop

    ③查看:service crond status

二、认识crontab

1、crontab命令

crontab file [-u user]-用指定的文件替代目前的crontab。

crontab-[-u user]-用标准输入替代目前的crontab.

crontab-1[user]-列出用户目前的crontab.

crontab-e[user]-编辑用户目前的crontab.

crontab-d[user]-删除用户目前的crontab.

crontab-c dir- 指定crontab的目录。

crontab文件的格式:M H D m d cmd.

2、crontab文件格式

*  *  *  *  *  command
分 时 日 月 周   命令

第1列表示分钟1~59, 每分钟用*或者 */1表示
第2列表示小时1~23(0表示0点)
第3列表示日期1~31
第4列表示月份1~12
第5列标识号星期0~6(0表示星期天)
第6列要运行的命令


参数 :

crontab -e : 执行文字编辑器来设定时程表,内定的文字编辑器是 VI,如果你想用别的文字编辑器,则请先设定 VISUAL 环境变数

来指定使用那个文字编辑器(比如说 setenv VISUAL joe)

crontab -r : 删除目前的时程表

crontab -l : 列出目前的时程表

crontab file [-u user]-用指定的文件替代目前的crontab。

时程表的格式如下 :

f1 f2 f3 f4 f5 program

其中 f1 是表示分钟,f2 表示小时,f3 表示一个月份中的第几日,f4 表示月份,f5 表示一个星期中的第几天。program 表示要执

行的程序。

当 f1 为 * 时表示每分钟都要执行 program,f2 为 * 时表示每小时都要执行程序,其馀类推

当 f1 为 a-b 时表示从第 a 分钟到第 b 分钟这段时间内要执行,f2 为 a-b 时表示从第 a 到第 b 小时都要执行,其馀类推

当 f1 为 */n 时表示每 n 分钟个时间间隔执行一次,f2 为 */n 表示每 n 小时个时间间隔执行一次,其馀类推

当 f1 为 a, b, c,... 时表示第 a, b, c,... 分钟要执行,f2 为 a, b, c,... 时表示第 a, b, c...个小时要执行,其馀类推

使用者也可以将所有的设定先存放在档案 file 中,用 crontab file 的方式来设定时程表。


3、配置实例

    ①每天早上7点执行一次 /bin/ls : 

        0 7 * * * /bin/ls

    ②在 12 月内, 每天的早上 6 点到 12 点中,每隔3个小时执行一次 /usr/bin/backup :

       0 6-12/3 * 12 * /usr/bin/backup

    ③周一到周五每天下午 5:00 寄一封信给alex@domain.name:
       0 17 * * 1-5 mail -s "hi"alex@domain.name< /tmp/maildata
    ④每月每天的午夜 0 点 20 分, 2 点 20 分, 4 点 20 分....执行 echo "haha"
       20 0-23/2 * * * echo "haha"

4、查看crontab的执行情况

    crontab默认情况下把执行日志写在/var/log下面,如:

Shell代码 
ls /var/log/cron*  
//输出结果为
/var/log/cron /var/log/cron.1 /var/log/cron.2 /var/log/cron.3 /var/log/cron.4

    其中/var/log/cron就是crontab的最新日志信息。通过查看cron日志,我们就可以了解在crontab中配置的任务是否正常执行。

    crontab的日志比较简单,我们也可以为crontab中的任务增加自己的日志,这样出错后,比较容易看到原因。例如:

Crontab代码
#把错误输出和标准输出都输出到mylog.log中  
0 6 * * * $HOME/for_crontab/createTomorrowTables >> $HOME/for_crontab/mylog.log 2>&1
#注意:不要写成
0 6 * * * $HOME/for_crontab/createTomorrowTables 2>&1 >> $HOME/for_crontab/mylog.log
#否则就输出到标准输出了