crontab 细节

 最近写了一个oracle exp自动导出的脚本,单独执行可以正常运行,放在crontab任务中就无法执行拉。


脚本1:setenv.sh

export ORACLE_BASE=/opt/oracle
export ORACLE_HOME=$ORACLE_BASE/10.2.0
export ORACLE_SID=db
export PATH=$ORACLE_HOME/bin:$PATH
export LANG=zh_CN
export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK

脚本2:orabak.sh

#!/bin/bash
/opt/oracle/setenv
bakname=`date +%Y%m%d`
cd /opt/oracle
mkdir -p /opt/oracle/orabak/$bakname
/opt/oracle/10.2.0/bin/exp wyg/wyg file=/opt/oracle/orabak/$bakname/$bakname.dmp log=/opt/oracle/orabak/$bakname/$bakname.log
tar -zcvf /opt/oracle/orabak/$bakname/$bakname.dmp.tgz /opt/oracle/orabak/$bakname/$bakname.dmp
rm -rf /opt/oracle/orabak/$bakname/$bakname.dmp

crontab定时任务设置:

46 20 * * * /opt/oracle/orabak.sh

实验后的启示:
1.orabak.sh这个脚本调用了setenv这个环境变量脚本,其实完全可以把setenv脚本中的环境变量写在orabak.sh中,不必多此一 举。
2.orabak.sh调用setenv,在crontab中只部分执行,脚本中exp那段没有执行,应该和环境变量有很大的关系。把setenv中的环 境变量直接写到orabak.sh脚本中,就没有这个问题。

摘录这个,解释crontab环境变量的问题:

crontab是进行例行性工作常用的命令,比如系统备份,编写一个备份 的shell脚本后,使用crontab定时执行这个备份脚本,就可实现自动备份了。将备份时间设置在三更半夜系统访问量小的时候,既不会影响系统日常使 用,也不用派人盯着,第二天看一下邮件,检查一下执行结果就好了。
   这里就不描述如何使用crontab了,这些资料网上一大把,下面将我使用crontab曾经犯过的几个错误和大家分享一下
1.使用普通变量

    crontab执行shell时只能识别为数不多的系统环境变量,普通变量是无法识别的,如果在编写的脚本中需要使用变量,需要使用export将变量声 明为环境变量,脚本才能正常执行。

2.使用相对路径

   crontab执行shell时,是不会进入到shell脚本所在的路径下执行的,如果shell里含有相对路径的话,会找不到路径的,因此shell脚 本中都要使用绝对路径。

3.权限设置错误


   权限问题永远是linux需要注意的问题,一定要确保crontab的执行者(/etc/crontab文档设置的第二项)有访问shell脚本所在目录 并且执行此shell的权限(可使用chomd和chown修改权限和所有者)。

3.crontab生效一定要在2分钟以后,我在做实验的时候图快,每次修改了脚本以后,crontab都在一分钟之内设置,导致crontab根本就不 起作用,切记!

4.感觉调用setenv这个方法不对,调用的setenv环境变量似乎是在子shell中执行的,所以当前有关oracle的命令在脚本中就无法正常执 行拉。crontab对环境变量的要求还是蛮高的。

5.crontab执行的脚本要写绝对路径,被执行的脚本内一定要配置好环境变量,也要用绝对路径。不是必须,但要结合crontab使用,就必须这样。

6.结论:当没有把握做某个事情的时候,还是依照有把握的方法来做吧!不需要setenv脚本调用,直接把环境变量写在orabak.sh脚本中,确保 crontab执行万无一失!

我的最终可用稿

 

#!/bin/bash
/oracle/backup
bname=`date +%Y%m%d`
cd /oracle
mkdir -p /oracle/backup/db$bname
/oracle/product/11.1.0/db_1/bin/exp cms/cmsadmin owner=cms file=/oracle/backup/db$bname/db$bname.dmp
tar -zcvf /oracle/backup/db$bname/db$bname.dmp.tar.gz /oracle/backup/db$bname/db$bname.dmp
rm -rf /oracle/backup/db$bname/db$bname.dmp
find /oracle/backup -mtime +30 -exec rm -rf {} \;

你可能感兴趣的:(oracle,crontab,无效)