利用While解決檔案等待問題

來源:互聯網
上載者:User

前幾天有個朋友向筆者求助,他說他在Unix系統管理的時候遇到了一個問題。他在Unix系統中部署了一個資料庫系統。現在他希望能夠對這個資料庫實現異地備份。他的解決思路是,先利用資料庫自身的功能進行本地備份(資料庫沒有自動進行異地備份的功能),然後再將這個備份檔案複製到異地去。如果備份是確定的,即按照計劃來進行備份,如每天晚上12點備份,這是好解決的。只需要利用Unix系統內建的CRON任務計劃功能即可以解決。但是現在的問題是,有時候這個備份具有不確定性。如資料庫管理員有時候也需要進行臨時的備份,為此他希望對於這些臨機操作備份也能夠自動實現異地備份。所以,此時利用cron任務計劃功能就無能為力了。

一、解決思路。

針對這些臨時性的備份任務,如果少的話,那麼可以對其進行手工異地備份。然後利用cron任務計劃執行有計劃的異地備份工作。如果臨時性備份比較頻繁,而使用者又確實對異地備份的功能比較急切的話,那麼就只能夠採用其他折中的處理方式。筆者下面的這個解決思路,希望能夠協助解決這個問題。這個思路比較簡單,即讓作業系統隔一段固定的時間(如10分鐘)就去檢查一下是否有產生了備份檔案。如果產生了的話,則系統就將這個備份檔案移動(不是複製)到異地進行備份。

不過筆者這裡要介紹的是另外一種解決方式,即利用while迴圈來解決這個檔案等待的問題。其實,這個檔案等待也不是這個系統工程師遇到的問題,而是具有一定的普遍性。如一個應用程式需要從一個檔案中讀取資料,而這個檔案又是另一個應用程式或者同一個應用程式的不同進程所產生的。為此,必須在另外一個程式或者進程建立完這個檔案之後,原先的應用程式才能夠得到順利的運行。所以,如果從程式設計的角度,就是需要使用某個指令碼,去偵測這個特定的檔案是否已經成功建立。如果建立的話,執行某個命令,讓其自動調用某個程式。如在實現無人值守安裝時,需要一個參數檔案。此時系統工程師可以編寫一個指令碼,先判斷這個參數檔案是否存在。如果存在的話,則馬上進行安裝。如果不存在的話,則進行等待。直到這個設定檔正常建立,然後啟動安裝進程(此時系統工程師不需要重新啟動指令碼程式)。

二、具體實現。

以上介紹的這個思路,主要是利用while迴圈來實現的。利用while迴圈,作業系統會重複的執行一組命令,直到控制命令返回一個假false的狀態值。如果要實現上面這個無人值守的安裝進程,可以通過如下的指令碼來實現。

While [! –r profile.txt] #迴圈條件陳述式

do #迴圈動作陳述式

sleep 30

done

./setup.sh

在編寫這個指令碼的時候,各個部分的含義是什麼,又有哪些注意事項呢?具體來說,系統工程師需要掌握下面的內容。這些是寫好一個while迴圈結構最基本的東西。

首先,需要直到常見迴圈條件陳述式的書寫。一般來說,任何Unix命令或者test內容都可以作為迴圈條件。也就是說,只要掌握了Unix常用的命令,既可以寫好迴圈語句。話雖然這麼說,但是有時候寫這個迴圈語句的時候,系統工程師往往需要有一定的創意,或者說需要有經驗的積累。確實,最終的迴圈語句都是基本的作業系統命令所組成的。但是有時候往往需要對他們進行靈活的組合。如筆者上面用的這個迴圈條件陳述式,相對來說比較簡單,但是並不一定每個系統工程師都可以像得到。筆者這個! –r profile.txt迴圈條件陳述式的含義,就是不能夠讀某個檔案。一般情況下建立的檔案目前使用者都是可讀的。如果系統判斷不可讀的話,那麼百分之百可以確定是這個檔案不存在(只要許可權沒有調整過)。換句話說,有時候系統工程師往往需要換一種角度去考慮問題。如按照這個案例,需要將“檔案不存在”轉換為“檔案不可讀”。此時這個迴圈條件陳述式就容易寫了。可惜的是,不少系統工程師缺少的就是這種轉換的能力。這部進行需要踏實的基礎,而且還需要一定的創新能力以及相當的工作經驗的積累。為此筆者建議,要用好Unix作業系統或者Linux作業系統,那麼在平時的工作中就要有意識的鍛煉自己這種能力。

其次需要瞭解動作陳述式的編寫技巧。有時候為了實現某些特定的需求,往往在while迴圈結構內部的動作陳述式部分,不會寫一些實際的動作陳述式。而是將動作陳述式寫在迴圈的外部。如上面這個案例中,筆者在內部的動作陳述式部分,使用了語句sleep 30。這是什麼意思呢?如果結合整個While迴圈結構,他的意思就是,如果條件滿足的話(profile設定檔不可讀,即不存在),則每個30秒執行以下這個迴圈。如果條件不滿足的話(profile設定檔可讀,即存在),則跳出這個迴圈,然後執行後續的語句。也就是說,此時筆者將真正要執行的操作(啟動某個安裝進程),放在了迴圈的外部。而在迴圈內部使用sleep 30,用來控制迴圈執行的時間。當然,在這個迴圈內部也可以寫一些實際性的操作。如在螢幕上或者安裝日誌中顯示一些“找不到配製檔案”等類似的錯誤資訊。往往這些類似友好的提示資訊,可以提高程式的友好性。類似的處理機制還有很多。系統工程師需要在日常的工作中注意總結。另外,如果多看看其他工程師編寫的指令碼程式,往往能夠從中擷取不少有價值性的內容。模仿往往是在最短時間內增強自己業務能力的捷徑。

最後就是需要注意書寫格式與規範方面的內容。在編寫迴圈結構時,無論是while迴圈還是for迴圈,如果能夠有意識的採用TAB鍵或者空格鍵,可以明顯的提高代碼的可讀性。如迴圈內部結構的執行語句最好能夠跟do或者done等關鍵字分行寫,並且採用縮排的格式。雖然即時不遵守這些規則,指令碼程式也沒有實質性的影響。但是,對後續維護閱讀的時候,會增加不少的困難。特別是當迴圈內部語句比較多的時候。所以對於這些代碼編寫規範,系統工程師最好還是需要遵守。畢竟對於一些複雜的功能,需要團隊合作才能夠實現。如果大家都能夠遵守同一的書寫規範,那麼無疑可以提高團隊的協作型。還有就是需要注意文法方面的內容,不do後面沒有分號結尾符等等。這些文法性的錯誤系統在執行時會告知,所以問題不大。只是會增加返工的幾率與工作量而已。

三、利用while實現無限迴圈。

如上面那個資料庫異地備份的案例,其實若能夠通過無限迴圈來實現可能會更加的合適。如讓作業系統每隔30分鐘來執行一次迴圈。迴圈內不能的操作就是先利用if語句來判斷備份檔案是否在30分鐘內更新過。如果有更新的話,就將其複製或者移動到遠端伺服器上。不管有沒有更新,這個迴圈的話,每30分鐘就需要執行一次。此時就需要用到無限迴圈。利用while迴圈條件的含義,這個無限迴圈很容易實現,只需要迴圈條件陳述式設定為true即可。即while true ; do 動作陳述式 ;done &。

在這個迴圈結構中,筆者採用true作為迴圈條件,其迴圈條件永遠為真,那麼作業系統就會一直迴圈下去,直到使用者手工終止。另外需要注意的是,如果迴圈語句比較簡單,可以在同一行中書寫。只是在中間合適的位置(如關鍵字之前)需要加以分號來進行識別。另外,為了避免對其他進程進行幹擾,最好將這些無限迴圈的操作放置到後台運行,這可以保障各個進程之間相對的獨立性。此時只需要在done關鍵字後面加入&符號即可,就可以告訴作業系統將這個無限迴圈放入到後台運行。

不過在編寫無限迴圈的時候,需要注意死迴圈的發生。如迴圈內部的某個操作比較耗時。在這個操作還沒有完成之前,新的迴圈又開始了。這久而久之,必將耗盡系統資源。為此,在程式內部最好還是需要設定一些條件,如CPU等資源的使用程度,來強制結束無限迴圈。筆者認為這是比較安全的處理方式,可以有效避免無限迴圈影響作業系統效能。

  1. Linux系統下配置Netware伺服器方法
  2. 嵌入式裝置上的 Linux 系統開發
  3. 深度介紹Linux核心是如何工作的(1)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.