项目背景:自动建立词典的脚本,线上每天要更新RS的词典,需要在定期的从log平台上挖掘数据并建立词典,以便第二天更新线上词典。需要对建库的脚本定期的执行。
作用:crontab是循环执行例行性的任务,每个用户都有自己的crontab文件,存在/var/spool/cron目录下。
语法: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)
(1)
使用:
可以用crontab
-e 添加要执行的命令。 命令执行的结果,无论是标准输出还是错误输出,都将以邮件形式发给用户。
添加的命令必须以如下格式: *
* * * * /command path
前五个字段可以取整数值,指定何时开始工作,第六个域是字符串,即命令字段,其中包括了crontab调度执行的命令。 各个字段之间用spaces和tabs分割。
前5个字段分别表示:
分钟:0-59
小时:1-23
日期:1-31
月份:1-12
星期:0-6(0表示周日)
还可以用一些特殊符号:
*: 表示任何时刻
,: 表示分割
-:表示一个段,如第二端里: 1-5,就表示1到5点
/n
: 表示每个n的单位执行一次,如第二段里,*/1, 就表示每隔1个小时执行一次命令。也可以写成1-23/1.
crontab文件条目例子:
30 21 * * *
/usr/local/apache/bin/apachectl
restart 表示每晚的21:30重启apache。
(2)
& 后台执行命令
当在前台运行某个作业时,终端被该作业占据;而在后台运行作业时,它不会占据终端。可以使用&命令把作业放到后台执行。
如:
30
2 * * * /data/app/scripts/hotbackup/hot_database_backup.sh
&
在后台运行作业时要当心:需要用户交互的命令不要放在后台执行,因为这样你的机器就会在那里傻等。
不过,作业在后台运行一样会将结果输出到屏幕上,干扰你的工作。如果放在后台运行的作业会产生大量的输出,最好使用下面的方法把它的输出重定向到某个文件中:
如:command
>out.file 2>&1 &
在这个例子中,2>&1表示所有的标准输出和错误输出都将被重定向到一个叫做out.file 的文件中。
(3)
2>&1 含义
先看一个例子:
0 2 * * *
/u01/test.sh >/dev/null 2>&1 &
这句话的意思就是在后台执行这条命令,并将错误输出2重定向到标准输出1,然后将标准输出1全部放到/dev/null 文件,也就是清空。
在这里有有几个数字的意思:
0表示键盘输入
1表示标准输出
2表示错误输出.
我们也可以这样写:
0 2 * * *
/u01/test.sh >/u01/out.file
& --这里没写,默认是1
0 2 * * *
/u01/test.sh 1>/u01/out.file
&
0 2 * * *
/u01/test.sh 2>/u01/out.file
&
0 2 * * *
/u01/test.sh 2>/u01/out.file 2>&1
&
将tesh.sh 命令输出重定向到out.file, 即输出内容不打印到屏幕上,而是输出到out.file文件中。
2>&1 是将错误输出重定向到标准输出。 然后将标准输入重定向到文件out.file。
&1 表示的是文件描述1,表示标准输出,如果这里少了&就成了数字1,就表示重定向到文件1。
(4)
注意事项
不要假定cron知道所需要的特殊环境,它其实并不知道。所以你要保证在shelll脚本中提供所有必要的路径和环境变量,除了一些自动设置的全局变量。所以注意如下3点:
1)脚本中涉及文件路径时写全局路径;
2)脚本执行要用到java或其他环境变量时,通过source命令引入环境变量,如:
cat
start_cbp.sh
#!/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 &
3)当手动执行脚本OK,但是crontab死活不执行时。这时必须大胆怀疑是环境变量惹的祸,并可以尝试在crontab中直接引入环境变量解决问题。如:
0 * * * * .
/etc/profile;/bin/sh
/var/www/java/audit_no_count/bin/restart_audit.sh
(5)
其他应该注意的问题
1)新创建的cron
job,不会马上执行,至少要过2分钟才执行。如果重启cron则马上执行。
2) 每条 JOB
执行完毕之后,系统会自动将输出发送邮件给当前系统用户。日积月累,非常的多,甚至会撑爆整个系统。所以每条 JOB
命令后面进行重定向处理是非常必要的: >/dev/null 2>&1 。前提是对 Job
中的命令需要正常输出已经作了一定的处理, 比如追加到某个特定日志文件。
3)当crontab突然失效时,可以尝试/etc/init.d/crond
restart解决问题。或者查看日志看某个job有没有执行/报错tail -f /var/log/cron。
4)千万别乱运行crontab
-r。它从Crontab目录(/var/spool/cron)中删除用户的Crontab文件。删除了该用户的所有crontab都没了。
5)在crontab中%是有特殊含义的,表示换行的意思。如果要用的话必须进行转义\%,如经常用的date
‘+%Y%m%d’在crontab里是不会执行的,应该换成date ‘+\%Y\%m\%d’`。