定时任务Java编写综述之OS级的Linux crontab命令方式

定时任务Java编写综述

目前我所用过的定时任务机制主要分三类:OS级的Linux crontab命令方式、Java语言级的JDK自带API、第三方API接口如Quartz(当然,其他MVC框架如Spring基于Quartz实现了更人性化的API接口,此类接口一并归入Quartz类族)。

 

这三种方式相比,OS级不用专门开启监听器,占用系统资源较少,是定时任务首选的实现方式;JDK自带API主要是TimerTimeTask,这些API提供的接口功能简单,往往不能满足用户定时任务设置需要;QuartzJava语言编写的API,其可以单独部署,也可以作为系统的模块嵌入既有代码中,通过开启监听触发定时任务的方式实现,相对而言,特别是用此种方式开辟大量监听很耗资源。

 

下面分别介绍这三种常用的定时任务实现方式。

 

1.      OS级的Linux crontab命令方式

crontab命令的功能是在一定的时间间隔调度一些命令的执行。

/etc目录下有一个crontab文件,这里存放有系统运行的一些调度程序。每个用户可以建立自己的调度crontab

/etc/cron.deny 表示不能使用crontab 命令的用户

/etc/cron.allow 表示能使用crontab的用户。

 

如果两个文件同时存在,那么/etc/cron.allow 优先。

如果两个文件都不存在,那么只有超级用户可以安排作业。

 

每个用户都会生成一个自己的crontab 文件。这些文件在/var/spool/cron目录下,该文件里面的内容和对应用户显示的crontab -l 一致。

 

linux缺省会启动crond进程,crond进程不需要用户启动、关闭。 crond进程负责读取调度任务并执行,用户只需要将相应的调度脚本写入cron的调度配置文件中。 

cron的调度文件有以下几个:crontabcron.dcron.dailycron.hourlycron.monthlycron.weekly。如果用的任务不是以hourly monthly weekly方式执行,则可以将相应的crontab写入到crontab cron.d目录中。

 

1.1 Crontab语法

usage:  crontab [-u user] file

        crontab [-u user] [ -e | -l | -r ]

                (default operation is replace, per 1003.2)

        -e      (edit user's crontab)

        -l      (list user's crontab)

        -r      (delete user's crontab)

        -i      (prompt before deleting user's crontab)

        -s      (selinux context)

 

      其中,file是命令文件的名字。如果在命令行中指定了这个文件,那么执行crontab命令,则将这个文件拷贝到crontabs目录下;如果在命令行中没有制定这个文件,crontab命令将接受标准输入(键盘)上键入的命令,并将他们也存放在crontab目录下。常用命令如下:

crontab -l #查看你的任务

crontab-e#编辑你的任务

crontab-r#删除用户的crontab的内容

其中用crontab -e 添加要执行的命令。命令执行的结果,无论是标准输出还是错误输出,都将以邮件形式发给用户。

   添加的命令必须以如下格式:

   * * * * * /command path

      前五个字段可以取整数值,指定何时开始工作,第六个域是字符串,即命令字段,其中包括了crontab调度执行的命令。各个字段之间用spacestabs分割。

 

5个字段分别表示:

      分钟:0-59

      小时:1-23

      日期:1-31

      月份:1-12

      星期:0-60表示周日)

 

还可以用一些特殊符号:

      *表示任何时刻

      ,: 表示分割

  -:表示一个段,如第二端里: 1-5,就表示15

      /n : 表示每个n的单位执行一次,如第二段里,*/1, 就表示每隔1个小时执行一次命令。也可以写成1-23/1.

 

示例如下:

00 8,12,16 * * * /data/app/scripts/monitor/df.sh

30 2 * * * /data/app/scripts/hotbackup/hot_database_backup.sh

10 8,12,16 * * * /data/app/scripts/monitor/check_ind_unusable.sh

10 8,12,16 * * * /data/app/scripts/monitor/check_maxfilesize.sh

10 8,12,16 * * * /data/app/scripts/monitor/check_objectsize.sh

 

43 21 * * * 21:43 执行

15 05 * * *    05:15 执行

0 17 * * * 17:00 执行

0 17 * * 1 每周一的 17:00 执行

0,10 17 * * 0,2,3 每周日,周二,周三的 17:00 17:10 执行

0-10 17 1 * * 毎月1日从 17:007:10 毎隔1分钟执行

0 0 1,15 * 1 毎月1日和 15日和一日的 0:00 执行

42 4 1 * *   毎月1日的 4:42执行

0 21 * * 1-6  周一到周六 21:00 执行

0,10,20,30,40,50 * * * * 每隔10执行

*/10 * * * *       每隔10执行

* 1 * * *        1:01:59 每隔1分钟执行

0 1 * * *         1:00 执行

0 */1 * * *       毎时0每隔1小时执行

0 * * * *        毎时0每隔1小时执行

2 8-20/3 * * *      8:02,11:02,14:02,17:02,20:02 执行

30 5 1,15 * *       1 15日的 5:30 执行

 

1.2 & 后台执行命令

      当在前台运行某个作业时,终端被该作业占据;而在后台运行作业时,它不会占据终端。可以使用&命令把作业放到后台执行。如:

      30 2 * * * /data/app/scripts/hotbackup/hot_database_backup.sh &

      在后台运行作业时要当心:需要用户交互的命令不要放在后台执行,因为这样你的机器就会在那里傻等。

      不过,作业在后台运行一样会将结果输出到屏幕上,干扰你的工作。如果放在后台运行的作业会产生大量的输出,最好使用下面的方法把它的输出重定向到某个文件中:

      如:command >out.file 2>&1 &

      在这个例子中,2>&1表示所有的标准输出和错误输出都将被重定向到一个叫做out.file 的文件中。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值