<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 188,comments - 176,trackbacks - 0

    在編寫shell腳本的時候,有時候需要在執(zhí)行完shell腳本(手工執(zhí)行或利用crontab定時執(zhí)行),需要服務器上制定目錄下的文件或子目錄進行刪除操作,以免下次執(zhí)行時產生數據沖突。

    現(xiàn)需要編寫一個shell腳本,完成以下功能:
    [1]從系統(tǒng)B那邊將指定目錄下的文本文件FTP到系統(tǒng)A本地服務器的制定目錄下。
    [2]FTP到本地后,執(zhí)行系統(tǒng)A本地上的shell腳本,將文本文件中的信息入到系統(tǒng)A本地映射的數據庫中。
    [3]入庫完畢后,再FTP到系統(tǒng)B將遠程的0指定目錄下的那個文本文件刪除。
    [4]系統(tǒng)A上shell將其本地的相關目錄下的文文本件和子目錄的內容刪除,防止下次執(zhí)行產生數據重復和沖突。
    注:系統(tǒng)A和B都是HP-Unix,且系統(tǒng)A上的shell_a和系統(tǒng)B上的shell_b執(zhí)行時間為每天晚上23:00之后,它們時間差大概十分鐘(如 在23:00時刻執(zhí)行shell_b,到23:10時刻執(zhí)行shell_a)。

    上面步驟當中涉及到刪除操作的有[3]和[4],而問題就發(fā)生在第[4]步。第[4]步中的刪除系統(tǒng)A本地上目錄下的文件,這里我是用rm來進行刪除的。首先我的shell腳本部署在系統(tǒng)A的:/home/coner/blackall/目錄下,名稱為black_all.sh。
    腳本中對于刪除本地文件的代碼如下(注:blackall目錄下的data 和 ctl子目錄已經存在)

    #!/bin/sh
    sqlldr_dir=`pwd`
    sqlldr_data_dir
    ="data"

    cd 
    $sqlldr_dir/$sqlldr_data_dir
    rm 
    -*.txt

    對于上面代碼,當shell腳本手工執(zhí)行的時候,結果沒有任何問題,sqlldr_dir的值此時為腳本所在的路徑:/home/coner/blackall/,故cd $sqlldr_dir/$sqlldr_data_dir可以成功登錄到/home/coner/blackall/data下,再進行rm -f *將data子目錄下的所有文件刪除(文件不分前綴和后綴名)。但對于定時任務,要用crontab部署的情況下呢?
    問題就出在這里,筆者測試,利用crontab將該shell部署后,設置定時時間,到點后通過重定向生成的日志中,看到sqlldr_dir打印到日志中的值并不是/home/coner/blackall/,而是/home/coner。故可以推斷到,上面的刪除代碼,當用定時任務部署的時候,$sqlldr_dir/$sqlldr_data_dir的值就為/home/coner/data,而在系統(tǒng)A上/home/coner目錄下沒有此目錄,即cd 操作失敗,系統(tǒng)拋出異常(及時碰巧有這個目錄data,也是誤刪除文件的操作)。接著執(zhí)行下面的rm -f *。此時,crontab命令對于該shell腳本所在位置的解析為/home/coner,故在執(zhí)行rm -f *的時候就將/home/coner目錄下的所有文件全部刪除掉了,這樣就造成誤刪除文件的惡果。

    郁悶+揪心中...不過幸運的是,執(zhí)行腳本前有做手工的文件備份。

    鑒于上面情況,筆者將shell腳本重新進行了審核,將sqlldr_dir=`pwd`換成sqlldr_dir=/home/coner/blackall,并對cd操作加上異常保護。代碼如下:

    #!/bin/sh
    sqlldr_dir=/home/coner/blackall
    sqlldr_data_dir
    ="data"

    cd 
    $sqlldr_dir/$sqlldr_data_dir >/dev/null 2>&1
    if [ $? -ne 0 ]
         then 
              echo 
    "the path of $sqlldr_dir/$sqlldr_data_dir invalid.."
              
    exit  
         
    else
              echo 
    "begin rm -f $sqlldr_dir/$sqlldr_data_dir/*.txt"
              rm 
    -*.txt
    fi

    或者在能確定路徑的情況下直接寫成定值: rm -f /home/coner/blackall/data/*.txt


    對于crontab命令執(zhí)行定時任務,和登錄系統(tǒng)后,在用戶coner下手工執(zhí)行shell是有區(qū)別的。前者在執(zhí)行腳本時候,解析pwd命令只能解析到當前用戶即coner目錄為止,即上面的sqlldr_dir的值為/home/coner,而在用戶coner下手工執(zhí)行shell是在解析pwd命令時可以正常解析到/home/coner/blackall。這個和shell腳本初始化.profile(Unix)或.bash_profile(Linux)沒有關系,即使在腳本中進行下面的初始化操作:

    # if HP-UX and AIX
    if [ -/home/zxin10/.profile ]
     then
              echo 
    "INIT profile TO UNIX"
              
    . /home/zxin10/.profile
    fi
    # if Linux
    if [ -/home/zxin10/.bash_profile ]
               then
              echo 
    "INIT bash_profile TO LINUX"
               
    . /home/zxin10/.bash_profile
    fi

    在用crontab執(zhí)行腳本時,解釋pwd的時候,sqlldr_dir的值還是/home/coner。
    上面的初始化腳本,主要是針對利用crontab部署定時任務時,因為crontab啟動的命令并不讀當前的.profile,因此所有的程序需要的環(huán)境變量需要用程序或shell自己去設置(和手工執(zhí)行shell不同,手工執(zhí)行shell是在某個登錄用戶下執(zhí)行的,登錄該用戶之后,就已經初始化了環(huán)境變量配置文件),那么在shell中調用第三方軟件的一些命令(如Oracle的sqlplus和sqlldr等命令)時,如果程序中直接寫成sqlplus或sqlldr命令來調用時,腳本是識別不到這些命令的。在定時任務執(zhí)行完畢后的系統(tǒng)郵件(mail命令查看)中會提示找不到該命令。解決方法就是在執(zhí)行shell腳本的業(yè)務邏輯前先初始化操作系統(tǒng)的環(huán)境變量配置文件.profile或.bash_profile。如果不初始化也可以,那么在shell中調用這些命令時,需要將其寫成絕對路徑,如:/home/oracle/oracle92/bin/sqlldr這樣的形式。

    上面是我個人的實踐和理解,歡迎大家提出好的建議,共同參考學習。



    posted on 2008-05-18 17:18 cheng 閱讀(3265) 評論(0)  編輯  收藏 所屬分類: Unix/Linux
    主站蜘蛛池模板: 亚洲AV无码片一区二区三区| 亚洲自偷自偷在线制服| 久久青青草原亚洲AV无码麻豆| 亚洲欧美日韩中文字幕一区二区三区 | 亚洲精品无码日韩国产不卡?V| 亚洲国产日韩在线人成下载| 久久99免费视频| 亚洲人色婷婷成人网站在线观看| 人妻18毛片a级毛片免费看| 国产精品成人免费综合| 亚洲天天做日日做天天看| 两个人看www免费视频| 国产亚洲精品线观看动态图| 成人嫩草影院免费观看| 亚洲AV无码不卡在线观看下载| 亚洲AV无码一区二区三区性色| 成年人免费网站在线观看| 亚洲国产成人无码AV在线影院| 在线观看免费大黄网站| 亚洲人成色777777老人头| 国产精品免费_区二区三区观看| 亚洲国产精品18久久久久久| 亚洲国产精品尤物YW在线观看| 黄页免费在线观看| 亚洲w码欧洲s码免费| 免费在线观看中文字幕| 男人进去女人爽免费视频国产| 亚洲婷婷第一狠人综合精品| 国产伦一区二区三区免费| a级毛片免费全部播放| 亚洲影视自拍揄拍愉拍| 亚洲成片观看四虎永久| 免费A级毛片在线播放| 亚洲AV无码成人网站在线观看| 色噜噜AV亚洲色一区二区| 嘿嘿嘿视频免费网站在线观看| 黄色网址免费在线| 亚洲美女大bbbbbbbbb| 亚洲不卡无码av中文字幕| 30岁的女人韩剧免费观看| 日本永久免费a∨在线视频|