最近在写一个RMAN自动自动备份脚本,调试期间遇到了系统级环境设置的影响,通过这些异常我们对操作系统有了进一步的了解
服务器环境:CentOS 5.5 Final
本地测试环境:Ubuntu 10.04 LTS
crontab内容:
0 3 * * * /backup/backup.sh 2&> /backup/err.log
异常:backup.sh在命令行运行正常,只要放到crontab里面,备份没有成功,运行日志生成不完整【也就是rman内部运行内容没有记录到日志中】
我们来看下oracle,安装的时候我们会对.bash_profile进行一些环境变量的配置,这些配置伴随着oracle用户的一生,那么备份脚本也是离不开他们的
CentOS里面我们在shell脚本最前面加载下就可以了:# Export ENV
source /home/oracle/.bash_profile
Ubuntu里面在这个地方有些区别,它没有.bash_profile文件。我们看下/home/oracle
ls -la /home/oracle/
-rw------- 1 oracle oinstall 15186 2010-06-23 13:22 .bash_history
-rw-r--r-- 1 oracle oinstall 220 2010-06-01 15:46 .bash_logout
-rw-r--r-- 1 oracle oinstall 3761 2010-06-21 11:12 .bashrc
-rw-r--r-- 1 oracle oinstall 1302 2010-06-23 14:32 .profile
加载需要改为
# Export ENV
source /home/oracle/.profile【不要使用.bashrc,因为它只面向当前会话】
如果你个人爱好.bash_profile可以手动创建一个,其内容为.profile里面的环境变量配置,一个都不能少。加载和CentOS一样
由此了解到问题与crontab没有关系,而是环境变量没有起作用。那么为什么在命令行执行就没问题呢,因为我们在su到oracle用户的时候环境变量已经被加载了
现在再到crontab里面运行下,应该没问题了^_^
大家可以参考下 Fenng 的crontab笔记 里面描述了引发crontab失效的常见问题
[@more@]
这里需要额外提一下的是我不严谨的地方:(
脚本的开头记得写清除是:
#!/bin/bash
我写的是
#!/bin/sh【一般系统默认是/bin/sh->bash,这里ubuntu是/bin/sh->dash,sh种类很多,自己写严谨了没有错】
两者是有区别的,以前都是偷懒这样写,这次在加载profile的时候遇到了问题。我们都知道加载文件可以使用source和.两种方式,而脚本中只有bash支持source,我就是被这个小问题困扰了半天,如果你喜欢用sh的话那么可以使用.加载,否则会提示:source not found,而这个错误没有被打印到错误日志,无语