1. crontab的安装

1.1. 检测服务器是否已经安装了crontab:

rpm -qa |

如果未安装,进行下列操作:

  1. yum install vixie-cron --> vixie-cron是安装cron的主程序
  2. yum install crontabs --> contabs用来安装、卸装、或列举用来驱动 cron 守护进程的表格的程序

1.2. 操作命令

service crond start //启动服务 
service crond stop //关闭服务
service crond restart //重启服务
service crond reload //重新载入配置

service crond status //查看状态

chkconfig –level 35 crond on //设置开机自动启动crond服务:

chkconfig –list crond //开机级别的crond服务运行情况 ,2、3、4、5级别开机会自动启动crond服务
chkconfig

2. crond表达式

{minute} {hour} {day-of-month} {month} {day-of-week} {full-path-to-shell-script}

  • minute: 区间为 0 – 59
  • hour: 区间为0 – 23
  • day-of-month: 区间为0 – 31
  • month: 区间为1 – 12. 1 是1月. 12是12月.
  • Day-of-week: 区间为0 – 7. 周日可以是0或7.

一些符号的使用:

  • 星号(*):代表所有可能的值,如month字段为星号,则表示在满足其它字段的制约条件后每月都执行该命令操作。
  • 逗号(,):可以用逗号隔开的值指定一个列表范围,例如,“1,2,5,7,8,9”
  • 中杠(-):可以用整数之间的中杠表示一个整数范围,例如“2-6”表示“2,3,4,5,6”
  • 正斜线(/):可以用正斜线指定时间的间隔频率,例如“0-23/2”表示每两小时执行一次。
  • 百分号(%):在crontab中%是有特殊含义的,表示换行的意思。如果要用的话必须进行转义%,如经常用的date ‘+%Y%m%d’在crontab里是不会执行的,应该换成date ‘+%Y%m%d’。

示例:

  • 每5分钟运行一次命令
    */5 * * * * /root/bin/check-status.sh
  • 每个月的第一天 13:10运行
    10 13 1 * * /root/bin/full-backup.sh
  • 每个工作日 11 p.m 运行。
    0 23 * * 1-5 /root/bin/incremental-backup.sh
    0 23 * * 1,2,3,4,5 /root/bin/incremental-backup.sh

建议:

  • 数字的表示最好用2为阿拉伯数字显示
  • 周和日最好不要同时用
  • 定时任务要加注解
  • 可以定向到日志文件或者空文件
  • 定时任务一定是绝对路径,且目录必须存在才能出结果
  • crontab 服务一定要开启运行

3. cron表达式的添加

crontab执行脚本的添加有两种方式,一种是crond -e命令添加一个脚本,一种是创建一个crontab文件。

3.1 crond命令

使用crontab -e命令进行定时任务的编辑,部署一个脚本,示例如下:

*/1 * * * * sh /test/test.sh >>

其他命令:

crontab -e配置是针对某个用户的,而编辑/etc/crontab是针对系统的任务
crontab -l //列出当前的所有调度任务
crontab -l -u jp //列出用户jp的所有调度任务
crontab -r //删除所有任务调度工作
crontab

3.2 crontab文件(用户级别)

在考虑向cron进程提交一个crontab文件之前,首先要做的一件事情就是设置环境变量EDITOR。
cron进程根据它来确定使用哪个编辑器编辑 crontab文件。99%的UNIX和LINUX用户都使用vi,你可以编辑$ HOME目录下的. profile文件,在其 中加入这样一行:

EDITOR=vi; export

然后wq保存并退出

1)创建一个名为usercron的文件,其中user是用户名,例如, saintcron。在该文件中加入如下的内容

# 早上九点到晚上6点,每15分钟打印一句good job
0,15,30,45 09-18 * * * /bin/echo 'good job' >

2)提交刚刚创建的crontab文件,命令格式:crontab [-u user] file

crontab

3)同时,新创建文件的一个副本已经被放在/var/spool/cron目录中,文件名就是用户名(即saint)

使用场景:

用户定期要执行的工作,比如用户数据备份、定时邮件提醒等。用户可以使用 crontab 工具来定制自己的计划任务。所有用户定义的crontab 文件都被保存在 /var/spool/cron目录中。其文件名与用户名一致。

3.3 crontab文件(系统级别)

crontab文件格式

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed

前三行是用来配置crond任务运行的环境变量

  • 第一行SHELL变量指定了系统要使用哪个shell,这里是bash;
  • 第二行PATH变量指定了系统执行命令的路径;
  • 第三行MAILTO变量指定了crond的任务执行信息将通过电子邮件发送给root用户,如果MAILTO变量的值为空,则表示不发送任务执行信息给用户

1)编辑crontab文件

sudo vi

2)后续操作与3.2类似,最后重启一下crond服务。

4. 系统调度服务和用户调度服务

  • 系统级任务调度主要完成系统的一些维护操作。
  • 用户级任务调度主要完成用户自定义的一些任务。
  • 可以将用户级任务调度放到系统级任务调度来完成(不建议这么 做),但是反过来却不行,root用户的任务调度操作可以通过“crontab –uroot –e”来设置,也可以将调度任务直接写入/etc /crontab文件。
  • 如果要定义一个定时重启系统的任务,就必须将任务放到/etc/crontab文件,即使在root用户下创建一个 定时重启系统的任务也是无效的。

5. 注意点

1)可以在crontab文件中设置如下形式,忽略日志输出

0 */3 * * * /usr/local/apache2/apachectl restart >/dev/null 2>&1

“/dev/null 2>&1”表示先将标准输出重定向到/dev/null,然后将标准错误重定向到标准输出,由于标准输出已经重定向到了/dev/null,因此标准错误也会重定向到/dev/null,这样日志输出问题就解决了。
2)脚本执行要用到java或其他环境变量时,通过source命令引入环境变量,如:

#!/bin/sh
source /etc/profile
export RUN_CONF=/home/d139/conf/platform/cbp/cbp_jboss.conf
/usr/local/jboss-4.0.5/bin/run.sh -c mev &

六、Crontab和scp结合使用

Linux下文件传输一般有两个命令scp、ftp(工具需要下载安装)

1. scp的文件传输脚本

这里假设主机A 用来获到主机B的文件。

  1. 在主机A的用户根目录下执行如下命令来生成配对密钥:
    ssh-keygen -t rsa
    遇到提示回车默认即可,两次回车后,显示完成。公钥被存到用户目录下.ssh目录,比如root存放在:
    /root/.ssh/id_rsa.pub
  2. 将 .ssh 目录中的 id_rsa.pub 文件复制到 主机B 的 ~/.ssh/ 目录中,并改名为 authorized_keys,
  3. 到主机A中执行命令和主机B建立信任,例(假设主机B的IP为:192.168.100.4):
    scp ~/.ssh/id_rsa.pub 192.168.100.4:/root/.ssh/authorized_keys (如果是集群之间实现秘钥免登录,authorized_keys里面的内容就只能累加,而不能这样直接修改文件名)
  4. 下面就可以用scp、ssh命令不需要密码来获取主机B的文件了
    ssh 192.168.100.4 回车就不需要密码了。

注:其实id_rsa.pub内容添加到对方机器的authorized_keys中就行了

  1. 修改crontab的配置文件
    sudo vi /etc/crontab
  2. 使用crontab -e命令进行定时任务的编辑,部署一个脚本
*/1 * * * * sh /data/wind/Wind.WDP.BackUpEsData/test.sh >>
  1. crontab -l 查看已经运行的定时任务