專利名稱:一種對后臺程序進(jìn)行監(jiān)控的方法
技術(shù)領(lǐng)域:
本發(fā)明涉及后臺程序管理技術(shù)領(lǐng)域,特別是指一種對后臺程序進(jìn)行監(jiān)控的方法。
背景技術(shù):
在服務(wù)器的操作系統(tǒng)中,一般的業(yè)務(wù)應(yīng)用程序是作為后臺程序,且該程序獨(dú)立運(yùn)行,不受任何監(jiān)視與控制。在后臺程序運(yùn)行的過程中,如果某些后臺程序出現(xiàn)異常、錯誤,將導(dǎo)致這些后臺程序崩潰,并退出系統(tǒng)停止運(yùn)行,那么用戶將再也不能享受此后臺程序所提供的服務(wù),直至管理員發(fā)現(xiàn)并手工重新啟動運(yùn)行這些后臺程序使之恢復(fù)正常為止。對于電信、銀行、保險等要求高可靠性的領(lǐng)域,如遇此問題,其危害更甚。
發(fā)明內(nèi)容
有鑒于此,本發(fā)明的目的在于提供一種對后臺程序進(jìn)行監(jiān)控的方法,在不增加成本的前提下,可以實(shí)時監(jiān)視后臺程序的運(yùn)行,在發(fā)現(xiàn)后臺程序異常崩潰后,可立即重新啟動該后臺程序,從而解決后臺程序運(yùn)行時的可靠性問題,可為用戶持續(xù)提供服務(wù)。
為達(dá)到上述目的,本發(fā)明的技術(shù)方案是這樣實(shí)現(xiàn)的一種對后臺程序進(jìn)行監(jiān)控的方法,該方法包括以下步驟A、定義需要監(jiān)視的后臺程序的可執(zhí)行文件名及其相對應(yīng)的絕對路徑,并將與絕對路徑相對應(yīng)的進(jìn)程句柄作為元素值保存在進(jìn)程數(shù)組中,同時,將絕對路徑與文件名的對應(yīng)關(guān)系保存在系統(tǒng)內(nèi)存中;B、用監(jiān)視函數(shù)監(jiān)視進(jìn)程數(shù)組的元素值,當(dāng)被監(jiān)視的后臺程序發(fā)生異常退出時,根據(jù)進(jìn)程數(shù)組下標(biāo)所對應(yīng)的數(shù)組元素值得到退出的后臺程序的進(jìn)程句柄,再根據(jù)進(jìn)程句柄與絕對路徑的對應(yīng)關(guān)系得到該后臺程序的可執(zhí)行文件的絕對路徑,重新啟動運(yùn)行此后臺程序,同時操作系統(tǒng)返回該后臺程序的新進(jìn)程句柄,替換進(jìn)程數(shù)組中該退出的后臺程序的進(jìn)程句柄,繼續(xù)接受監(jiān)視。
其中,所述的步驟A進(jìn)一步包括A1、在與監(jiān)控工具同一目錄下建立一個初始化文件,并在該文件中,設(shè)置用戶要求監(jiān)視的后臺程序的可執(zhí)行文件名及其絕對路徑;A2、從初始化文件中,獲取用戶需要監(jiān)視的后臺程序文件名的絕對路徑,并將之保存在系統(tǒng)內(nèi)存中;A3、獲取當(dāng)前系統(tǒng)運(yùn)行中的所有程序可執(zhí)行文件名及其絕對路徑;A4、將步驟A3中獲取的絕對路徑與步驟A2中獲取的需監(jiān)視的后臺程序的絕對路徑相比較,如相同則將該絕對路徑相對應(yīng)的進(jìn)程句柄作為元素值保存在進(jìn)程數(shù)組中,如不同則放棄;A5、判斷初始化文件中,用戶要求監(jiān)視的后臺程序是否全部正在運(yùn)行,如果是則結(jié)束,否則執(zhí)行步驟A6;A6、將沒有運(yùn)行的后臺程序的可執(zhí)行文件的絕對路徑,作為參數(shù)送給進(jìn)程創(chuàng)建函數(shù),啟動并運(yùn)行這些后臺程序;A7、將步驟A6中啟動并運(yùn)行的后臺程序的絕對路徑的進(jìn)程句柄作為元素值保存在進(jìn)程數(shù)組中。
其中,所述的步驟A3進(jìn)一步包括A31、調(diào)用獲取進(jìn)程函數(shù)得到系統(tǒng)中當(dāng)前運(yùn)行的所有進(jìn)程句柄;A32、調(diào)用獲取模塊文件名的函數(shù)得到系統(tǒng)中當(dāng)前運(yùn)行的所有模塊句柄;A33、調(diào)用獲取模塊可執(zhí)行文件名函數(shù)得到所有后臺程序的每個進(jìn)程中的每個模塊的可執(zhí)行文件名及其絕對路徑。
其中,所述的步驟B進(jìn)一步包括在由線程創(chuàng)建函數(shù)創(chuàng)建的子線程中,使用監(jiān)視函數(shù)對后臺程序進(jìn)行監(jiān)控。
其中,所述的步驟B進(jìn)一步包括B1、調(diào)用監(jiān)視進(jìn)程句柄的函數(shù)監(jiān)視進(jìn)程數(shù)組中所有進(jìn)程句柄,判斷是否有進(jìn)程句柄退出;B2、根據(jù)退出的進(jìn)程句柄得到與其相對應(yīng)下標(biāo),將該下標(biāo)返回給等待多對象函數(shù),進(jìn)而得到退出的進(jìn)程句柄;B3、通過進(jìn)程句柄與絕對路徑對應(yīng)關(guān)系的列表找到與該退出的進(jìn)程句柄相對應(yīng)的可執(zhí)行文件的絕對路徑,將該絕對路徑作為一個參數(shù)送給進(jìn)程創(chuàng)建函數(shù),重新啟動并運(yùn)行此后臺程序。
應(yīng)用本發(fā)明,只需針對每種操作系統(tǒng)開發(fā)一個監(jiān)控工具軟件,即可實(shí)現(xiàn)對任何需要監(jiān)視的后臺程序進(jìn)行監(jiān)控,不需增加任何成本,即可有效提高后臺程序運(yùn)行的可靠性,為用戶提供持續(xù)有效的服務(wù)。本發(fā)明的方法簡單實(shí)用,可操作性好,可適用于多種操作系統(tǒng)。
圖1用戶定義的后臺程序的可執(zhí)行文件名以及這些文件的絕對路徑的列表;圖2后臺程序文件的進(jìn)程句柄與該文件的絕對路徑對應(yīng)關(guān)系的列表;圖3進(jìn)程數(shù)組示意圖;圖4為監(jiān)控工具得到需要監(jiān)控的后臺程序的可執(zhí)行文件名以及這些文件的絕對路徑流程圖;圖5為通過監(jiān)控工具監(jiān)控用戶定義的后臺程序并重新啟動已退出的后臺程序的流程圖。
具體實(shí)施例方式
為使本發(fā)明的目的、技術(shù)方案及優(yōu)點(diǎn)更加清楚明白,以下參照附圖并舉實(shí)施例,對本發(fā)明做進(jìn)一步詳細(xì)說明。
本實(shí)施例以Windows操作系統(tǒng)為例。
在實(shí)施監(jiān)控之前,用戶建立一個初始化文件,在該文件中設(shè)置需要監(jiān)視的后臺程序的可執(zhí)行文件名以及這些文件的絕對路徑,其對應(yīng)關(guān)系如圖1所示,后臺程序的可執(zhí)行文件名與該文件的絕對路徑一一對應(yīng),以保證在監(jiān)控工具啟動時,從該初始化文件中可讀取到需要監(jiān)視的后臺程序文件的絕對路徑,并保存在字符串?dāng)?shù)組中。
監(jiān)控過程如下,首先,從系統(tǒng)運(yùn)行的所有后臺程序中得到用戶定義的需要監(jiān)視的后臺程序的可執(zhí)行文件名及其絕對路徑,將得到的要監(jiān)視的后臺程序的可執(zhí)行文件名保存在進(jìn)程句柄(在程序運(yùn)行期間,操作系統(tǒng)將為每一個后臺程序文件分配一個唯一的進(jìn)程號,即每一個后臺程序文件都將得到一個進(jìn)程的標(biāo)識符,這種標(biāo)識符在Windows操作系統(tǒng)下稱之為進(jìn)程句柄,是一個HANDLE類型的值)與絕對路徑映射的數(shù)組中,進(jìn)程句柄與絕對路徑的對應(yīng)關(guān)系如圖2所示的列表,該列表保存在系統(tǒng)的內(nèi)存中;將要監(jiān)視的后臺程序文件的絕對路徑保存為進(jìn)程數(shù)組,如圖3所示進(jìn)程數(shù)組示意圖,數(shù)組的元素值為進(jìn)程句柄,數(shù)組下標(biāo)為需要監(jiān)控的文件名在數(shù)組中的位置。
這樣,需要監(jiān)視的后臺程序的可執(zhí)行文件名、絕對路徑以及該后臺程序的進(jìn)程句柄便形成一一對應(yīng)關(guān)系。
其次,在CreateThread()函數(shù)創(chuàng)建的子線程里,監(jiān)控工具監(jiān)控后臺程序文件,如果后臺程序產(chǎn)生錯誤退出,則自動重新啟動該退出的后臺程序。
具體過程如下如圖4所示監(jiān)控工具得到需要監(jiān)控的后臺程序可執(zhí)行文件的文件名以及這些文件的絕對路徑的流程圖步驟401,調(diào)用GetFileNameFromInitFile()函數(shù)從初始化文件中獲取需要監(jiān)視的后臺程序可執(zhí)行文件的絕對路徑,并保存在內(nèi)存中;步驟402,調(diào)用EnumProcess()函數(shù)得到系統(tǒng)中當(dāng)前運(yùn)行的所有進(jìn)程句柄;步驟403,通過應(yīng)用程序編程接口(API)遍歷系統(tǒng)中的每個進(jìn)程;步驟404,調(diào)用EnumProcessModules()函數(shù),得到進(jìn)程中的所有模塊句柄;步驟405,通過API遍歷進(jìn)程中的每個模塊;步驟406,調(diào)用GetModuleFileNameEx()函數(shù),得到系統(tǒng)中每個模塊的可執(zhí)行文件名及其絕對路徑。
步驟407,用上一步得到的系統(tǒng)中當(dāng)前運(yùn)行進(jìn)程中的每個模塊的可執(zhí)行文件的絕對路徑與用戶自己定義的需要監(jiān)視的后臺程序文件的絕對路徑進(jìn)行對比;如果相同則執(zhí)行步驟409,將后臺程序的絕對路徑保存在需要監(jiān)視的進(jìn)程數(shù)組中;執(zhí)行步驟410,將后臺程序的可執(zhí)行文件名保存在進(jìn)程句柄與絕對路徑映射的數(shù)組中,否則執(zhí)行步驟408,執(zhí)行空操作跳過。
步驟411,判斷上述對比是否完畢,如果是執(zhí)行步驟412,否則執(zhí)行步驟107繼續(xù)對比。
步驟412,判斷用戶定義的需要監(jiān)視的后臺程序是否全部正在運(yùn)行,如果是則結(jié)束,否則執(zhí)行步驟413;步驟413,將沒有運(yùn)行的后臺程序的絕對路徑作為參數(shù)給CreateProcess()函數(shù),啟動并運(yùn)行這些后臺程序;步驟414,將后臺程序的絕對路徑保存在需要監(jiān)控的進(jìn)程數(shù)組中;步驟415,將后臺程序的可執(zhí)行文件名保存在進(jìn)程句柄與絕對路徑映射的數(shù)組中。
如圖5所示通過監(jiān)控工具監(jiān)視用戶定義的后臺程序并重新啟動退出的后臺程序的流程圖步驟501,利用WaitForMultipleObjects()函數(shù)監(jiān)視進(jìn)程數(shù)組中所有進(jìn)程句柄;步驟502,判斷是否有進(jìn)程退出;如果是執(zhí)行步驟503,根據(jù)退出的進(jìn)程句柄得到與其相對應(yīng)的下標(biāo),將該下標(biāo)返回給WaitForMultipleObjects()函數(shù),進(jìn)而得到退出的進(jìn)程句柄,再通過進(jìn)程句柄與絕對路徑的對應(yīng)關(guān)系找到該退出的進(jìn)程句柄的可執(zhí)行文件的絕對路徑;否則重復(fù)執(zhí)行步驟502;步驟504,將該絕對路徑作為一個參數(shù)送給CreateProcess()函數(shù),重新啟動并運(yùn)行此后臺程序;步驟505,將操作系統(tǒng)返回的新進(jìn)程句柄替換進(jìn)程數(shù)組中該退出的后臺程序的進(jìn)程句柄,繼續(xù)接受WaitForMultipleObjects()函數(shù)的監(jiān)視。
UNIX操作系統(tǒng)或其它操作系統(tǒng)的監(jiān)控方法類似。
以上所述僅為本發(fā)明的較佳實(shí)施例而已,并不用以限制本發(fā)明,凡在本發(fā)明的精神和原則之內(nèi),所作的任何修改、等同替換、改進(jìn)等,均應(yīng)包含在本發(fā)明的保護(hù)范圍之內(nèi)。
權(quán)利要求
1.一種對后臺程序進(jìn)行監(jiān)控的方法,其特征在于該方法包括以下步驟A、定義需要監(jiān)視的后臺程序的可執(zhí)行文件名及其相對應(yīng)的絕對路徑,并將與絕對路徑相對應(yīng)的進(jìn)程句柄作為元素值保存在進(jìn)程數(shù)組中,同時,將絕對路徑與文件名的對應(yīng)關(guān)系保存在系統(tǒng)內(nèi)存中;B、用監(jiān)視函數(shù)監(jiān)視進(jìn)程數(shù)組的元素值,當(dāng)被監(jiān)視的后臺程序發(fā)生異常退出時,根據(jù)進(jìn)程數(shù)組下標(biāo)所對應(yīng)的數(shù)組元素值得到退出的后臺程序的進(jìn)程句柄,再根據(jù)進(jìn)程句柄與絕對路徑的對應(yīng)關(guān)系得到該后臺程序的可執(zhí)行文件的絕對路徑,重新啟動運(yùn)行此后臺程序,將操作系統(tǒng)返回該后臺程序的新進(jìn)程句柄,替換進(jìn)程數(shù)組中該退出的后臺程序的進(jìn)程句柄,繼續(xù)接受監(jiān)視。
2.根據(jù)權(quán)利要求1所述的一種對后臺程序進(jìn)行監(jiān)控的方法,其特征在于,所述的步驟A進(jìn)一步包括A1、在與監(jiān)控工具同一目錄下建立一個初始化文件,并在該文件中,設(shè)置用戶要求監(jiān)視的后臺程序的可執(zhí)行文件名及其絕對路徑;A2、從初始化文件獲取文件名和絕對路徑,并將之保存在系統(tǒng)內(nèi)存中;A3、獲取當(dāng)前系統(tǒng)運(yùn)行中的所有程序的進(jìn)程的句柄及其絕對路徑;A4、將步驟A3中獲取的絕對路徑與步驟A2中獲取的需監(jiān)視的后臺程序的絕對路徑相比較,如相同則將該絕對路徑對應(yīng)的進(jìn)程句柄作為元素值保存在進(jìn)程數(shù)組中,如不同則放棄;A5、判斷初始化文件中,用戶要求監(jiān)視的后臺程序是否全部正在運(yùn)行,如果是則結(jié)束,否則執(zhí)行步驟A6;A6、將沒有運(yùn)行的后臺程序的可執(zhí)行文件的絕對路徑,作為參數(shù)送給進(jìn)程創(chuàng)建函數(shù),啟動并運(yùn)行這些后臺程序;A7、將步驟A6中啟動并運(yùn)行的后臺程序的絕對路徑的進(jìn)程句柄作為元素值保存在進(jìn)程數(shù)組中。
3.根據(jù)權(quán)利要求2所述的一種對后臺程序進(jìn)行監(jiān)控的方法,其特征在于,所述的步驟A3進(jìn)一步包括A31、調(diào)用獲取進(jìn)程函數(shù)得到系統(tǒng)中當(dāng)前運(yùn)行的所有進(jìn)程句柄;A32、調(diào)用獲取模塊文件名的函數(shù)得到系統(tǒng)中當(dāng)前運(yùn)行的所有模塊句柄;A33、調(diào)用獲取模塊可執(zhí)行文件名函數(shù)得到所有程序的每個進(jìn)程中的每個模塊的可執(zhí)行文件名及其絕對路徑。
4.根據(jù)權(quán)利要求1所述的一種對后臺程序進(jìn)行監(jiān)控的方法,其特征在于,所述的步驟B進(jìn)一步包括在由線程創(chuàng)建函數(shù)創(chuàng)建的子線程中,使用監(jiān)視函數(shù)對后臺程序進(jìn)行監(jiān)控。
5.根據(jù)權(quán)利要求1所述的一種對后臺程序進(jìn)行監(jiān)控的方法,其特征在于,所述的步驟B進(jìn)一步包括B1、調(diào)用監(jiān)視進(jìn)程句柄的函數(shù)監(jiān)視進(jìn)程數(shù)組中所有進(jìn)程句柄,判斷是否有進(jìn)程退出;B2、根據(jù)退出的進(jìn)程句柄得到與其相對應(yīng)下標(biāo),該下標(biāo)被返回給等待多對象函數(shù),進(jìn)而得到退出的進(jìn)程句柄;B3、通過進(jìn)程句柄與絕對路徑對應(yīng)關(guān)系的列表找到與該退出的進(jìn)程句柄相對應(yīng)的可執(zhí)行文件的絕對路徑,將該絕對路徑作為一個參數(shù)送給進(jìn)程創(chuàng)建函數(shù),重新啟動并運(yùn)行此后臺程序。
全文摘要
本發(fā)明提供了一種對后臺程序進(jìn)行監(jiān)控的方法,該方法包括以下步驟定義需要監(jiān)控后臺程序的可執(zhí)行文件名及其相對應(yīng)的絕對路徑,將進(jìn)程句柄數(shù)組、絕對路徑與文件名的對應(yīng)關(guān)系保存在系統(tǒng)內(nèi)存中;用監(jiān)視函數(shù)監(jiān)視進(jìn)程數(shù)組的元素值,當(dāng)被監(jiān)視的后臺程序發(fā)生異常退出時,根據(jù)進(jìn)程數(shù)組下標(biāo)所對應(yīng)的數(shù)組元素值得到退出的后臺程序的進(jìn)程句柄,再根據(jù)該進(jìn)程句柄得到該后臺程序的可執(zhí)行文件的絕對路徑,重新啟動運(yùn)行此后臺程序,將操作系統(tǒng)返回的后臺程序的新進(jìn)程句柄替換進(jìn)程數(shù)組中該退出的后臺程序的進(jìn)程句柄,繼續(xù)接受監(jiān)視。應(yīng)用本發(fā)明可在不增加成本的前提下,解決后臺程序運(yùn)行時的可靠性問題。
文檔編號G06F11/30GK1489049SQ0213085
公開日2004年4月14日 申請日期2002年10月11日 優(yōu)先權(quán)日2002年10月11日
發(fā)明者李剛, 楊小桐, 隆承志, 張建勝, 戴玉宏, 鄒勇, 剛 李 申請人:華為技術(shù)有限公司