專(zhuān)利名稱(chēng):一種限制shell腳本并行執(zhí)行的方法
技術(shù)領(lǐng)域:
本發(fā)明涉及l(fā)inux的腳本運(yùn)行控制,尤其涉及一種在linux和unix平臺(tái)上限制shell腳本并行執(zhí)行的方法。
背景技術(shù):
目前隨著linux的廣泛使用,shell腳本也得到了大量的運(yùn)用,但是在實(shí)際應(yīng)用的過(guò)程中,往往要求出現(xiàn)這種需求,同一個(gè)腳本同一時(shí)刻只允許一個(gè)shell腳本運(yùn)行,也就是說(shuō)同一個(gè)時(shí)刻不允許兩個(gè)以上相同的腳本都在運(yùn)行。
目前廣泛采用的“限制shell腳本同時(shí)允許的”技術(shù)有兩種,但都存在一定的不足第一種用ps一類(lèi)命令找出已經(jīng)運(yùn)行腳本的數(shù)量,如果大于等于2,就退出當(dāng)前腳本,等于1,則運(yùn)行。這種技術(shù)的缺點(diǎn)是首先,ps取得腳本文件進(jìn)程數(shù)量就有很多陷阱,例如有時(shí)無(wú)法ps到腳本文件的名稱(chēng),即使可以ps到腳本名,如果用到管道的話,由于子shell的原因,在大多數(shù)平臺(tái)下會(huì)得到奇怪的結(jié)果,有時(shí)得到數(shù)字a,有時(shí)又得到數(shù)字b,讓人無(wú)所適從。就算計(jì)數(shù)的問(wèn)題已經(jīng)解決了,還有問(wèn)題如果兩個(gè)腳本實(shí)例同時(shí)計(jì)數(shù),顯然數(shù)字都應(yīng)該等于2,于是兩個(gè)都退出了。于是在這一時(shí)間點(diǎn)上沒(méi)有一個(gè)腳本在執(zhí)行。
第二種加鎖的方法。就是腳本在執(zhí)行開(kāi)始先試圖得到一個(gè)“鎖”,得到則繼續(xù)執(zhí)行,反之就退出,這種方法的缺點(diǎn)是有兩個(gè)加鎖時(shí)如何避免多個(gè)進(jìn)程同時(shí)對(duì)同一個(gè)共享數(shù)據(jù)進(jìn)行某種處理,而結(jié)果又取決于執(zhí)行的順序、怎么樣避免出現(xiàn)“死鎖”的情況;對(duì)于前一個(gè)缺點(diǎn),目前廣泛采用的“創(chuàng)建目錄”、“符號(hào)連接”、“文件首行競(jìng)爭(zhēng)”等技術(shù)可以基本解決;后一個(gè)缺點(diǎn)解決起來(lái)很麻煩,問(wèn)題的難點(diǎn)在于如何找到一種“原子”操作,將檢測(cè)死鎖和刪除死鎖的動(dòng)作一步完成,否則又會(huì)出現(xiàn)與加鎖時(shí)同樣的問(wèn)題。例如進(jìn)程1檢測(cè)到死鎖;進(jìn)程2監(jiān)測(cè)到死鎖;進(jìn)程1刪除死鎖;進(jìn)程x(也可能是進(jìn)程1自己)加鎖,開(kāi)始運(yùn)行;進(jìn)程2(錯(cuò)誤地)刪除死鎖;此時(shí)鎖沒(méi)有占用,于是任意進(jìn)程都可以加鎖并投入運(yùn)行。這樣又出現(xiàn)了兩個(gè)進(jìn)程同時(shí)運(yùn)行的情況,目前還沒(méi)有找到一個(gè)好的刪除“死鎖”的原子操作。
發(fā)明內(nèi)容
本發(fā)明要解決的技術(shù)問(wèn)題就是提供一種限制shell腳本并行執(zhí)行的方法,克服現(xiàn)有技術(shù)中很難實(shí)現(xiàn)控制shell腳本并行執(zhí)行的問(wèn)題。
為了解決上述技術(shù)問(wèn)題,本發(fā)明提供一種限制shell腳本并行執(zhí)行的方法,應(yīng)用于linux和unix平臺(tái),包括如下步驟(1)當(dāng)有shell腳本需要執(zhí)行時(shí),腳本模塊處理器向管道寫(xiě)入請(qǐng)求;(2)令牌模塊處理器在管道另一端順序讀取所述請(qǐng)求,當(dāng)有令牌空閑時(shí),將令牌按請(qǐng)求的先后順序發(fā)給先請(qǐng)求的shell腳本進(jìn)程,直到?jīng)]有令牌可用;得到令牌的進(jìn)程允許運(yùn)行;沒(méi)有得到令牌的進(jìn)程則退出,不會(huì)執(zhí)行。
進(jìn)一步地,所述步驟(1)執(zhí)行之前,所述令牌模塊處理器判斷管道文件是否存在,若不存在則創(chuàng)建管道文件。
進(jìn)一步地,所述步驟(1)中,當(dāng)有shell腳本需要執(zhí)行時(shí),所述腳本模塊處理器先判斷令牌模塊處理器創(chuàng)建的管道文件是否存在,若存在則向管道寫(xiě)入請(qǐng)求,若不存在,則退出。
進(jìn)一步地,所述步驟(1)中,所述請(qǐng)求內(nèi)容包括需要執(zhí)行的shell腳本的進(jìn)程號(hào)。
進(jìn)一步地,當(dāng)所述得到令牌的進(jìn)程執(zhí)行完畢,腳本模塊處理器向管道發(fā)送終止信號(hào),交回令牌。
進(jìn)一步地,所述腳本模塊處理器通過(guò)trap命令捕獲進(jìn)程退出信號(hào),從而向管道發(fā)送終止信號(hào),交回令牌。
進(jìn)一步地,所述令牌模塊處理器定時(shí)檢測(cè)是否有死鎖出現(xiàn),若存在死鎖,則刪除死鎖進(jìn)程,并設(shè)置空閑的令牌數(shù)加1。
進(jìn)一步地,所述令牌模塊處理器通過(guò)一計(jì)數(shù)器累計(jì)循環(huán)次數(shù)來(lái)實(shí)現(xiàn)定時(shí),當(dāng)存在死鎖時(shí),計(jì)數(shù)器置位,重新開(kāi)始累計(jì)循環(huán)次數(shù)。
本發(fā)明引入的令牌概念,借鑒多進(jìn)程編程中臨界區(qū)的概念,如果各個(gè)進(jìn)程進(jìn)入設(shè)立的臨界區(qū),只可能一個(gè)一個(gè)地順序進(jìn)入,利用linux的管道,多個(gè)進(jìn)程寫(xiě)到同一個(gè)管道,只可能一行一行地進(jìn)入,相應(yīng)的,另一端也是一行一行地讀出,如此就可以實(shí)現(xiàn)并行執(zhí)行的多個(gè)進(jìn)程進(jìn)入臨界區(qū)時(shí)的“串行化”,利用單獨(dú)的死鎖檢測(cè)腳本,來(lái)檢測(cè)死鎖,這樣也就沒(méi)有多個(gè)并發(fā)進(jìn)程對(duì)同一個(gè)令牌進(jìn)行操作,所以上面描述的死鎖問(wèn)題發(fā)生的基礎(chǔ)也就根本不存在了,這樣就可以解決死鎖的問(wèn)題。
圖1本發(fā)明實(shí)施例限制shell腳本并行執(zhí)行的方法的流程圖;圖2是本發(fā)明應(yīng)用實(shí)例的令牌模塊處理器執(zhí)行流程圖;圖3是本發(fā)明應(yīng)用實(shí)例的腳本模塊處理器執(zhí)行流程圖。
具體實(shí)施例方式
本發(fā)明的主要思想就是,采用類(lèi)似以太網(wǎng)的令牌解決原先技術(shù)上的缺陷。
下面結(jié)合附圖及具體實(shí)施例對(duì)本發(fā)明進(jìn)行詳細(xì)說(shuō)明。
如圖1所示,本發(fā)明實(shí)施例限制shell腳本并行執(zhí)行的方法,包括如下步驟步驟101,當(dāng)有shell腳本需要執(zhí)行時(shí),腳本模塊處理器向管道寫(xiě)入請(qǐng)求,請(qǐng)求內(nèi)容包括需要執(zhí)行的shell腳本的進(jìn)程號(hào);步驟102,令牌模塊處理器在管道另一端順序讀取所述請(qǐng)求,當(dāng)有令牌空閑時(shí),將令牌按請(qǐng)求的先后順序發(fā)給先請(qǐng)求的shell腳本進(jìn)程,直到?jīng)]有令牌可用;得到令牌的進(jìn)程允許運(yùn)行;沒(méi)有得到令牌的進(jìn)程則退出,不會(huì)執(zhí)行;步驟103,當(dāng)一個(gè)進(jìn)程執(zhí)行完畢,向管道發(fā)送一個(gè)終止信號(hào),即交回令牌;
步驟104,令牌模塊處理器接受到令牌后,又開(kāi)始選取下一個(gè)進(jìn)程發(fā)放令牌。
所述令牌可以是一個(gè),也可以是多個(gè)。
本發(fā)明將檢測(cè)處理死鎖的代碼單獨(dú)拿出來(lái),交給令牌模塊處理器的一個(gè)專(zhuān)門(mén)的進(jìn)程來(lái)處理,檢測(cè)和刪除死鎖的任務(wù)由一個(gè)專(zhuān)門(mén)的進(jìn)程來(lái)執(zhí)行時(shí),就沒(méi)有多個(gè)并發(fā)進(jìn)程對(duì)同一個(gè)令牌進(jìn)行操作。令牌處理器的上述進(jìn)程還用于控制令牌的發(fā)放和回收。本發(fā)明中,還設(shè)置了一個(gè)計(jì)數(shù)器用于定時(shí),從而定時(shí)檢查是否存在死鎖,該計(jì)數(shù)器可調(diào)整其定時(shí)時(shí)間。
下面對(duì)本發(fā)明在網(wǎng)絡(luò)視訊中的定期執(zhí)行對(duì)數(shù)據(jù)庫(kù)操作的腳本的并發(fā)數(shù)控制來(lái)對(duì)令牌模塊處理器執(zhí)行流程和腳本模塊處理器執(zhí)行流程進(jìn)行說(shuō)明。
如圖2所示,令牌模塊處理器執(zhí)行流程包括如下步驟步驟201,令牌模塊處理器在后臺(tái)運(yùn)行,判斷是否管道文件存在,若存在,則執(zhí)行步驟203,若不存在,則執(zhí)行步驟202;步驟202,創(chuàng)建管道文件;步驟203,設(shè)置基本的信息參數(shù),如允許shell腳本并發(fā)的最大數(shù)(即可用令牌個(gè)數(shù)),死鎖檢測(cè)周期;其中死鎖檢測(cè)周期通過(guò)設(shè)置循環(huán)計(jì)數(shù)實(shí)現(xiàn);步驟204,判斷循環(huán)次數(shù)是否達(dá)到設(shè)定值,即是否到了死鎖檢查周期,若是,則執(zhí)行步驟205;若否,則執(zhí)行步驟207;步驟205,因?yàn)檠h(huán)次數(shù)是由一個(gè)計(jì)數(shù)器來(lái)統(tǒng)計(jì)的,所以,當(dāng)?shù)竭_(dá)死鎖檢查周期時(shí),計(jì)數(shù)器復(fù)位,用于清零,重新進(jìn)行統(tǒng)計(jì);判斷是否存在死鎖,若是,則執(zhí)行步驟206,若否,則執(zhí)行步驟207;步驟206,刪除死鎖,當(dāng)前并發(fā)運(yùn)行shell腳本數(shù)減少1,即空閑的令牌數(shù)加1;步驟207,增加循環(huán)次數(shù),即循環(huán)次數(shù)加1;步驟208,檢查當(dāng)前并發(fā)運(yùn)行的shell腳本數(shù)是否達(dá)到步驟203設(shè)置的腳本并發(fā)的最大數(shù),若是,則執(zhí)行步驟211,若否,則執(zhí)行步驟209;步驟209,若當(dāng)前并發(fā)運(yùn)行的shell腳本數(shù)沒(méi)有達(dá)到設(shè)置的最大數(shù),也就是還有空閑的令牌可用,則判斷從管道中讀取的信息是申請(qǐng)令牌還是撤銷(xiāo)令牌,若是申請(qǐng)令牌,則執(zhí)行步驟210,否則執(zhí)行步驟212;
步驟210,分發(fā)令牌,當(dāng)前腳本并發(fā)數(shù)加1,返回執(zhí)行步驟204;步驟211,若當(dāng)前并發(fā)運(yùn)行的shell腳本數(shù)達(dá)到設(shè)置的最大數(shù),也就是沒(méi)有空閑的令牌可用,則丟棄申請(qǐng)令牌的操作,返回執(zhí)行步驟204;步驟212,若是撤銷(xiāo)令牌,則收回令牌,重新進(jìn)入接口5進(jìn)行再次循環(huán)當(dāng)前并發(fā)運(yùn)行的shell腳本數(shù)減少1,返回執(zhí)行步驟204。
如圖3所示,腳本模塊處理器執(zhí)行流程包括如下步驟步驟301,腳本模塊處理器判斷令牌模塊處理器創(chuàng)建的管道文件是否存在,若存在,則執(zhí)行步驟302,若不存在,則結(jié)束本次流程;步驟302,令牌模塊處理器的管道文件存在,把需要運(yùn)行的shell腳本的PID號(hào)(即進(jìn)程ID號(hào))寫(xiě)入管道文件,申請(qǐng)令牌;步驟303,通過(guò)令牌模塊處理器判斷獲是否獲得令牌,若是,則執(zhí)行步驟304,若否,則結(jié)束本次流程;步驟304,向管道寫(xiě)入腳本開(kāi)始進(jìn)行執(zhí)行行為;步驟305,執(zhí)行真正需要腳本處理事件,執(zhí)行結(jié)束后,進(jìn)入步驟306;步驟306,退出執(zhí)行腳本;步驟307,通過(guò)trap命令捕獲進(jìn)程退出信號(hào),向管道文件寫(xiě)入釋放令牌信息,令牌管理處理器通過(guò)該信號(hào)釋放該腳本占用的令牌,結(jié)束本次流程。
以上所述僅為本發(fā)明的優(yōu)選實(shí)施例而已,并不用于限制本發(fā)明,對(duì)于本領(lǐng)域的技術(shù)人員來(lái)說(shuō),本發(fā)明可以有各種更改和變化,本發(fā)明的保護(hù)范圍以權(quán)利要求為準(zhǔn)。
權(quán)利要求
1.一種限制shell腳本并行執(zhí)行的方法,應(yīng)用于linux和unix平臺(tái),包括如下步驟(1)當(dāng)有shell腳本需要執(zhí)行時(shí),腳本模塊處理器向管道寫(xiě)入請(qǐng)求;(2)令牌模塊處理器在管道另一端順序讀取所述請(qǐng)求,當(dāng)有令牌空閑時(shí),將令牌按請(qǐng)求的先后順序發(fā)給先請(qǐng)求的shell腳本進(jìn)程,直到?jīng)]有令牌可用;得到令牌的進(jìn)程允許運(yùn)行;沒(méi)有得到令牌的進(jìn)程則退出,不會(huì)執(zhí)行。
2.根據(jù)權(quán)利要求1所述的方法,其特征在于,所述步驟(1)執(zhí)行之前,所述令牌模塊處理器判斷管道文件是否存在,若不存在則創(chuàng)建管道文件。
3.根據(jù)權(quán)利要求1所述的方法,其特征在于,所述步驟(1)中,當(dāng)有shell腳本需要執(zhí)行時(shí),所述腳本模塊處理器先判斷令牌模塊處理器創(chuàng)建的管道文件是否存在,若存在則向管道寫(xiě)入請(qǐng)求,若不存在,則退出。
4.根據(jù)權(quán)利要求1所述的方法,其特征在于,所述步驟(1)中,所述請(qǐng)求內(nèi)容包括需要執(zhí)行的shell腳本的進(jìn)程號(hào)。
5.根據(jù)權(quán)利要求1所述的方法,其特征在于,當(dāng)所述得到令牌的進(jìn)程執(zhí)行完畢,腳本模塊處理器向管道發(fā)送終止信號(hào),交回令牌。
6.根據(jù)權(quán)利要求5所述的方法,其特征在于,所述腳本模塊處理器通過(guò)trap命令捕獲進(jìn)程退出信號(hào),從而向管道發(fā)送終止信號(hào),交回令牌。
7.根據(jù)權(quán)利要求1所述的方法,其特征在于,所述令牌模塊處理器定時(shí)檢測(cè)是否有死鎖出現(xiàn),若存在死鎖,則刪除死鎖進(jìn)程,并設(shè)置空閑的令牌數(shù)加1。
8.根據(jù)權(quán)利要求7所述的方法,其特征在于,所述令牌模塊處理器通過(guò)一計(jì)數(shù)器累計(jì)循環(huán)次數(shù)來(lái)實(shí)現(xiàn)定時(shí),當(dāng)存在死鎖時(shí),計(jì)數(shù)器置位,重新開(kāi)始累計(jì)循環(huán)次數(shù)。
全文摘要
本發(fā)明公開(kāi)了一種限制shell腳本并行執(zhí)行的方法,應(yīng)用于linux和unix平臺(tái),包括當(dāng)有shell腳本需要執(zhí)行時(shí),腳本模塊處理器向管道寫(xiě)入請(qǐng)求;令牌模塊處理器在管道另一端順序讀取所述請(qǐng)求,當(dāng)有令牌空閑時(shí),將令牌按請(qǐng)求的先后順序發(fā)給先請(qǐng)求的shell腳本進(jìn)程,直到?jīng)]有令牌可用;得到令牌的進(jìn)程允許運(yùn)行;沒(méi)有得到令牌的進(jìn)程則退出,不會(huì)執(zhí)行。本發(fā)明引入的令牌概念,利用linux的管道,實(shí)現(xiàn)并行執(zhí)行的多個(gè)進(jìn)程進(jìn)入臨界區(qū)時(shí)的“串行化”,利用單獨(dú)的死鎖檢測(cè)腳本,來(lái)檢測(cè)死鎖,沒(méi)有多個(gè)并發(fā)進(jìn)程對(duì)同一個(gè)令牌進(jìn)行操作,可以有效地解決死鎖的問(wèn)題。
文檔編號(hào)G06F9/48GK101082870SQ200710130140
公開(kāi)日2007年12月5日 申請(qǐng)日期2007年7月20日 優(yōu)先權(quán)日2007年7月20日
發(fā)明者謝斌 申請(qǐng)人:中興通訊股份有限公司