iamlaosong文
前面文章曾提到過的定時檢測壓縮包并完成解壓、修改文件名和導入到數據庫的腳本(檢測壓縮包并處理的linux腳本(解壓、批量修改文件名、導入)),后來發現放到crontab中就無法執行了,費了很大勁,一步步找問題,首先是腳本肯定執行了,后來在腳本中增加一些其他命令如pwd、echo等都執行了,最后發現是導入程序沒有執行,其實也不是沒有執行,而是執行后退出來了。
下面是找問題的過程:
首先,crond服務未啟動,這個可以排除,因為還有其他定時任務在做,簡單測試一下就可以發現腳本執行了。
第二,權限問題,比如沒有執行權限,這個也不存在,因為直接執行是正常的。
第三、路徑問題,任務命令是絕對路徑,腳本中加了pwd語句顯示路徑是對的,再說直接執行也沒問題。
第四、時差問題,因為服務器與客戶端時差問題,所以crontab的時間以服務器時間為準,這個也沒問題。
第五、變量問題,有時候命令中含有變量,但crontab執行時卻沒有,也會造成執行失敗,這個也沒問題。
上面五點只是解決crontab不能正常執行的問題,現在是腳本執行了,只是關鍵的導入命令沒有執行,于是我想到了環境變量的問題,因為導入程序是需要和Oracle打交道的,需要很多環境變量,原以為定時任務是在oracle用戶下建立的,應該具有這個用戶的環境變量,其實不然,定時任務執行時根本沒有加載這些環境變量。
找到問題,解決也很簡單,只需將.bash_PRofile執行一下就行了??梢栽诋斍澳_本中執行,也可以在其調用的腳本jsimp.sh中執行。下面是部分腳本:
#import data beginning. /home/oracle/.bash_profilecd ${BINDIR}for dd in ${SYFDAT}do ./jsimp.sh ${dd} SYFdonefor dd in ${BCFDAT}do ./jsimp.sh ${dd} BCFdone#end import代碼中. /home/oracle/.bash_profile前面的點(注意后面有個空格)表示腳本在同一個shell中執行, 所調用的腳本中聲明的變量和環境變量都可以在主腳本中得到和使用。在Linux平臺上開發,經常會在一個shell腳本中(或者控制臺)調用另外一個shell腳本文件,在一個腳本中調用另外一個腳本有三種方法:1、fork ( /directory/script.sh) fork是最普通的, 就是直接調用,即在腳本里面用/directory/script.sh來調用script.sh這個腳本。運行的時候開一個sub-shell執行調用的腳本,sub-shell執行的時候,parent-shell還在,sub-shell執行完畢后返回parent-shell。sub-shell從parent-shell繼承環境變量,但是sub-shell中的環境變量不會帶回parent-shell中。
2、exec (exec /directory/script.sh) 調用時腳本名稱前加上exec四個字符。exec與fork不同,不需要新開一個sub-shell來執行被調用的腳本,被調用的腳本與父腳本在同一個shell內執行。但是使用exec調用一個新腳本以后,父腳本中exec行之后的內容就不會再執行了。這是exec和source的區別。
3、source (source /directory/script.sh) 調用時前面加上source六個字符或者用一個“.”代替source。與fork的區別是不新開一個sub-shell來執行被調用的腳本,而是在同一個shell中執行。所以被調用的腳本中聲明的變量和環境變量都可以在主腳本中得到和使用。
簡單的說,fork相當于出國旅游了一趟,啥也沒帶回來;exec相當于直接出國定居了,再也不回來了;而source則是把外國的景點搬到國內,風景都留下來了。對應這三種方法,上面jsimp.sh腳本的調用寫法如下:
#fork./jsimp.sh#execexec ./jsimp.sh#source. ./jsimp.sh
新聞熱點
疑難解答