最近寫了一個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 {} \;
轉自:http://www.net527.cn/shujukuguanli/Oracle/2010/0319/8097.html