Crontab应用简介

来源:互联网 发布:设计简单网络通信协议 编辑:程序博客网 时间:2024/05/22 01:41

有时候我们需要定时地处理大量的数据,这里我们称之为Batch处理。

Batch处理就是定时地执行某个程序。其实可以很明显的看到,这里我们需要做到两个东东:定时执行程序。下面描述一下这两个东东。

定时:

我们这边使用的是Linux系统,如果我们需要按一定的周期执行程序,我们可以使用crontab来实现。crontab C)指令从指定文件或标准输入拷贝或编辑成用户的 crontab 文件,该文件规定了在指定日期和时间调度运行一些指令。

可以使用如下的方法来使用:

$ crontab -e

编辑方式与vi相同。

编辑结束然后保存退出,系统会自动的安装crontab。修改crontab时可以使用相同的方法。虽然有别的办法可以实现相同的效果,但是这里建议使用这种方法,安全第一嘛!

Example:

$ crontab -e

 

#Created by Yaogao 2005-12-30 12:43

30 11 * * * (echo "Crontab start to run ....";

. /etc/profile;/home/ebid/bin/bash.sh;echo "Crontab stopped!")

00 17 * * * (echo "Crontab start to run ....";

. /etc/profile;/home/ebid/bin/bash.sh;echo "Crontab stopped!")

解释一下:

第一:"#"注释开始

第二:30 11 * * * 标示各种时间。(30 11 * * *的意思是:每天1130)

所以这5个数分别代表minutes  hours  day_of_month  month  day_of_week

  minutes      分钟   0-59

  hours       小时   0-23

  day_of_month   日    1-31

  month       月    1-12

  day_of_week    星期     0-60表示星期日)

还有就是"*"代表该字段所有的可能值。

下面是比较有意思的一些时间设定:

#每天早上6

0 6 * * *

 

 

#每两个小时

0 */2 * * *

 

#晚上11点到早上8点之间每两个小时,早上8

0 23-7/28 * * *

 

#每个月的4号和每个星期的星期一到星期三的早上11

0 11 4 * mon-wed

 

#1月份1日早上4

0 4 1 jan *

第三:Command

对于command,如果只有单个命令,可以这样:

#每天早上6点执行date命令

0 6 * * * date

如果是多个命令:0 6 * * * (echo "Crontab start to run ....";

. /etc/profile;/home/ebid/bin/bash.sh;echo "Crontab stopped!")那么命令之间用";"分隔。执行顺序由先至后。

其实这里还有一个比较重要的东西,就是 . /etc/profile,这个命令必须得有,虽然这个是全局变量,而且系统启动之后就应该设定好了,但是这里仍然需要重新设定。

 

这样我们就实现了在固定的某个时间执行我们的程序。

 

执行程序:

执行程序就相对来说比较简单了,只要我们设置好需要的环境变量,那么程序就可以执行了。一般的做法都是写一个脚本,比如说上面的bash.sh

Example:

#!/bin/csh -f

#setenv hello 

setenv  CLASSPATH  '.'

set batch_home=/home/oracle/project/

set flist=`ls $batch_home/lib/*.jar`

foreach name ($flist)

        setenv CLASSPATH ${CLASSPATH}:${name}

end

 

echo "Shukei Start  .........."

cd   $batch_home/bin

java divinemind.onlyfun.Helloworld HelloYG

echo "Shukei End ........."

解释一下:

#!/bin/csh -f:指定shell,上面提到过注释,但是对于脚本,第一行不被认为是注释。这里我们使用C shell,虽然这种shell不赞成被使用,但是就像我们使用任何语言写Helloworld的效率都差不多一样,我们这里使用别的shell也没有什么区别。其实最重要的一点还是C shell有我很需要的一个重要的支持,下面会有提到。

 

#setenv hello  :注释

 

setenv  CLASSPATH  '.'  :设定环境变量,setenv命令跟bashexport命令一样可以设定环境变量。

 

set batch_home=/home/oracle/project/:设定shell变量。

set flist=`ls $batch_home/lib/*.jar` :设定shell变量。刚刚说到的C shell的一个重要支持就在这里。其实其他shell也应该可以实现。

 

foreach name ($flist)

        setenv CLASSPATH ${CLASSPATH}:${name}

end

循环设定环境变量。下面几句的功能就是将jar文件设定到环境变量,让java程序得以执行。

setenv  CLASSPATH  '.'

set batch_home=/home/oracle/project/

set flist=`ls $batch_home/lib/*.jar`

foreach name ($flist)

        setenv CLASSPATH ${CLASSPATH}:${name}

end

 

下面这几句很简单,就是执行java代码。

echo "Shukei Start  .........."

cd   $batch_home/bin

java divinemind.onlyfun.Helloworld HelloYG

echo "Shukei End ........."

 

上面描述了如何定时和如何写脚本执行我们的java程序,运行结果系统通过mail发送到当前用户的邮箱。bash.sh能够执行我们的java程序,crontab能够定时地执行我们的bash.sh,那么大家可以看到,batch处理功能已经做好,呵呵!

 

命令介绍:

如果对于Linux系统跟我一样不是很熟悉,下面介绍几个命令:

$ chmod 777 bash.sh

这个命令可以使bash.sh可执行。chmodchange modify的意思,后边的777表示文件所有者、组用户、其他用户都可以读、写、执行这个文件,修改777就可以设定别的权限(比如说666那么这个文件将不可以执行)。其实刚刚如果我们用vi建立bash.sh的时候,bash.sh是不可以执行的,但是使用这个命令之后就可以了。

 

还有就是chown(change owner)chgrp(change group)这两个命令,每当创建新文件与目录时,标记你是文件所有者,你的同组人员为组员,如果要把文件的使用权交给别人,只有文件所有者方可更改(当然root干什么都可以),命令如下:

chown owner file

chown改变了文件的身分ID UID

改变属组要改变文件所属的组别--文件组IDGID),命令变为:

chgrp group file

其实应该还有很多其他的命令,大家可以上网查询,我也有一些东西,可以跟大家共享。

 

Batch处理部署:

Batch处理的.class文件可以存放在任意目录下,当然需要当前用户拥有访问权限,所以我们一般情况下将文件存放在当前用户的工作目录(/home/currentuser)下,然后我们自己写的shell文件也是放在什么地方都可以,但是我们最好也是放在当前用户的工作目录下或者更下级目录。上面的例子中就将bash.sh放在了batch处理工程的/bin目录下。至于crontab,由于我们使用$crontab e命令,所以我们不需要关心文件所在的位置。