本發(fā)明的實(shí)施方式涉及互聯(lián)網(wǎng)技術(shù)領(lǐng)域,更具體地,本發(fā)明的實(shí)施方式涉及docker容器內(nèi)應(yīng)用進(jìn)程管理方法、裝置和計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)。
背景技術(shù):
本部分旨在為權(quán)利要求書中陳述的本發(fā)明的實(shí)施方式提供背景或上下文。此處的描述不因?yàn)榘ㄔ诒静糠种芯统姓J(rèn)是現(xiàn)有技術(shù)。
docker容器是一個(gè)開源的應(yīng)用容器引擎,開發(fā)者可以打包他們的應(yīng)用以及依賴包到一個(gè)可移植的容器中,然后發(fā)布到任何流行的linux機(jī)器上,也可以實(shí)現(xiàn)虛擬化。開發(fā)者在其開發(fā)環(huán)境測試通過的容器可以批量的在不同版本的linux生產(chǎn)環(huán)境中部署,容器可以在ubuntu,centos,rhel等支持docker容器的操作系統(tǒng)版本上運(yùn)行。。
現(xiàn)有的docker容器的使用都是直接在容器中啟動(dòng)單個(gè)進(jìn)程,或者通過bin/bash–c的形式調(diào)用shell腳本啟動(dòng)多個(gè)進(jìn)程。由于容器內(nèi)運(yùn)行的也是linux系統(tǒng),在容器內(nèi)與常規(guī)linux不同的是,容器不包含內(nèi)核。由于容器啟動(dòng)時(shí),第一個(gè)啟動(dòng)的進(jìn)程的pid為1,而linux系統(tǒng)對(duì)于pid為1的進(jìn)程有一些特殊的處理,所以會(huì)出現(xiàn)諸如應(yīng)用進(jìn)程無法向外部發(fā)送信號(hào)而終止以及孤兒進(jìn)程資源無法釋放等問題。
技術(shù)實(shí)現(xiàn)要素:
但是,出于系統(tǒng)對(duì)于第一個(gè)進(jìn)程特殊處理的原因,現(xiàn)有技術(shù)會(huì)產(chǎn)生應(yīng)用進(jìn)程無法終止以及孤兒進(jìn)程資源無法釋放的問題。
因此在現(xiàn)有技術(shù)中,無法對(duì)應(yīng)用進(jìn)程進(jìn)行有效接管,這是非常令人煩惱的過程。
為此,非常需要一種改進(jìn)的docker容器內(nèi)應(yīng)用進(jìn)程管理方法,以使應(yīng)用進(jìn)程可以通過系統(tǒng)信號(hào)進(jìn)行終止,并且可及時(shí)釋放孤兒進(jìn)程的資源。
在本上下文中,本發(fā)明的實(shí)施方式期望提供一種docker容器內(nèi)應(yīng)用進(jìn)程管理方法、裝置及計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)。
在本發(fā)明實(shí)施方式的第一方面中,提供了一種docker容器內(nèi)應(yīng)用進(jìn)程管理方法,包括:設(shè)置初始化進(jìn)程;對(duì)所述初始化進(jìn)程進(jìn)行分叉操作,得到初始進(jìn)程和第一子進(jìn)程;在初始進(jìn)程進(jìn)行系統(tǒng)信號(hào)注冊(cè)操作,通過監(jiān)聽系統(tǒng)信號(hào)并將系統(tǒng)信號(hào)轉(zhuǎn)發(fā)給所述第一子進(jìn)程以及所述第一子進(jìn)程執(zhí)行系統(tǒng)調(diào)用載入到所述docker容器內(nèi)的至少一個(gè)應(yīng)用進(jìn)程,從而對(duì)所述第一子進(jìn)程以及所述至少一個(gè)應(yīng)用進(jìn)程進(jìn)行接管。
在本發(fā)明的一個(gè)實(shí)施例中,該docker容器內(nèi)應(yīng)用進(jìn)程管理方法還包括:在初始進(jìn)程記錄第一子進(jìn)程以及所述至少一個(gè)應(yīng)用進(jìn)程的pid;所述初始進(jìn)程通過查找記錄的所述pid,將所述系統(tǒng)信號(hào)轉(zhuǎn)發(fā)給所記錄的pid對(duì)應(yīng)的所述第一子進(jìn)程和所述至少一個(gè)應(yīng)用進(jìn)程。
在本發(fā)明的一個(gè)實(shí)施例中,在所述初始進(jìn)程將系統(tǒng)信號(hào)轉(zhuǎn)發(fā)給所述第一子進(jìn)程和所述至少一個(gè)應(yīng)用進(jìn)程之后,該docker容器內(nèi)應(yīng)用進(jìn)程管理方法還包括:所述初始進(jìn)程監(jiān)聽系統(tǒng)信號(hào),確定系統(tǒng)信號(hào)是否包括容器運(yùn)行所處linux環(huán)境的linux內(nèi)核發(fā)送的sigchild信號(hào);如果所述初始進(jìn)程監(jiān)聽到與所述第一子進(jìn)程或所述應(yīng)用進(jìn)程關(guān)聯(lián)的sigchild信號(hào),則對(duì)所述第一子進(jìn)程或所述應(yīng)用進(jìn)程的資源進(jìn)行回收處理。
在本發(fā)明的一個(gè)實(shí)施例中,該docker容器內(nèi)應(yīng)用進(jìn)程管理方法包括:設(shè)置所述初始進(jìn)程的pid為1。
在本發(fā)明的一個(gè)實(shí)施例中,該docker容器內(nèi)應(yīng)用進(jìn)程管理方法包括:還包括:在所述第一子進(jìn)程進(jìn)行環(huán)境分離操作,并載入應(yīng)用初始化腳本,從而在所述第一子進(jìn)程執(zhí)行系統(tǒng)調(diào)用,將所述至少一個(gè)應(yīng)用進(jìn)程載入到所述docker容器內(nèi)。
在本發(fā)明的一個(gè)實(shí)施例中,還包括:對(duì)其中一個(gè)應(yīng)用進(jìn)程進(jìn)行分叉操作,得到互為父子關(guān)系的第一應(yīng)用進(jìn)程和第二應(yīng)用進(jìn)程,或者,在其中一個(gè)應(yīng)用進(jìn)程中啟動(dòng)另一個(gè)應(yīng)用進(jìn)程,得到互為父子關(guān)系的第一應(yīng)用進(jìn)程和第二應(yīng)用進(jìn)程。
在本發(fā)明的一個(gè)實(shí)施例中,還包括:所述初始進(jìn)程記錄所述第二應(yīng)用進(jìn)程的pid,所述第二應(yīng)用進(jìn)程是所述第一應(yīng)用進(jìn)程的子進(jìn)程;所述初始進(jìn)程通過查找記錄的所述pid,將所述系統(tǒng)信號(hào)轉(zhuǎn)發(fā)給所記錄的pid對(duì)應(yīng)的所述第二應(yīng)用進(jìn)程。
在本發(fā)明的一個(gè)實(shí)施例中,還包括:當(dāng)所述第一應(yīng)用進(jìn)程已終止或退出時(shí),將所述第二應(yīng)用進(jìn)程的父進(jìn)程設(shè)置為所述初始進(jìn)程。
在本發(fā)明的一個(gè)實(shí)施例中,還包括:所述初始進(jìn)程監(jiān)聽系統(tǒng)信號(hào),確定系統(tǒng)信號(hào)是否包括容器運(yùn)行所處linux環(huán)境的linux內(nèi)核發(fā)送的sigchild信號(hào);如果所述初始進(jìn)程監(jiān)聽到所述第二應(yīng)用進(jìn)程關(guān)聯(lián)的sigchild信號(hào),則對(duì)所述第二應(yīng)用進(jìn)程的資源進(jìn)行回收處理。
在本發(fā)明實(shí)施方式的第二方面中,提供了一種docker容器內(nèi)應(yīng)用進(jìn)程管理裝置,包括:初始化單元,用于設(shè)置初始化進(jìn)程;分叉操作單元,用于對(duì)所述初始化進(jìn)程進(jìn)行分叉操作,得到初始進(jìn)程和第一子進(jìn)程;初始進(jìn)程操作單元,用于在初始進(jìn)程進(jìn)行系統(tǒng)信號(hào)注冊(cè)操作,通過監(jiān)聽系統(tǒng)信號(hào)并將系統(tǒng)信號(hào)轉(zhuǎn)發(fā)給所述第一子進(jìn)程以及所述第一子進(jìn)程執(zhí)行系統(tǒng)調(diào)用載入到所述docker容器內(nèi)的至少一個(gè)應(yīng)用進(jìn)程,從而對(duì)所述第一子進(jìn)程以及所述至少一個(gè)應(yīng)用進(jìn)程進(jìn)行接管。
在本發(fā)明的一個(gè)實(shí)施例中,該docker容器內(nèi)應(yīng)用進(jìn)程管理裝置中,所述初始進(jìn)程操作單元還用于:在初始進(jìn)程記錄第一子進(jìn)程以及所述至少一個(gè)應(yīng)用進(jìn)程的pid;所述初始進(jìn)程通過查找記錄的所述pid,將所述系統(tǒng)信號(hào)轉(zhuǎn)發(fā)給所記錄的pid對(duì)應(yīng)的所述第一子進(jìn)程和所述至少一個(gè)應(yīng)用進(jìn)程。
在本發(fā)明的一個(gè)實(shí)施例中,該docker容器內(nèi)應(yīng)用進(jìn)程管理裝置中,所述初始進(jìn)程操作單元還用于:監(jiān)聽系統(tǒng)信號(hào),確定系統(tǒng)信號(hào)是否包括容器運(yùn)行所處linux環(huán)境的linux內(nèi)核發(fā)送的sigchild信號(hào);所述裝置還包括:資源釋放單元,用于當(dāng)監(jiān)聽到與所述第一子進(jìn)程或所述應(yīng)用進(jìn)程關(guān)聯(lián)的sigchild信號(hào)時(shí),對(duì)所述第一子進(jìn)程或所述應(yīng)用進(jìn)程的資源進(jìn)行回收處理。
在本發(fā)明的一個(gè)實(shí)施例中,該docker容器內(nèi)應(yīng)用進(jìn)程管理裝置還包括:子進(jìn)程操作單元,用于在所述第一子進(jìn)程進(jìn)行環(huán)境分離操作,并載入應(yīng)用初始化腳本,從而在所述第一子進(jìn)程執(zhí)行系統(tǒng)調(diào)用,將所述至少一個(gè)應(yīng)用進(jìn)程載入到所述docker容器內(nèi)。
在本發(fā)明的一個(gè)實(shí)施例中,還包括:應(yīng)用進(jìn)程處理單元,用于對(duì)其中一個(gè)應(yīng)用進(jìn)程進(jìn)行分叉操作,得到互為父子關(guān)系的第一應(yīng)用進(jìn)程和第二應(yīng)用進(jìn)程,或者,在其中一個(gè)應(yīng)用進(jìn)程中啟動(dòng)另一個(gè)應(yīng)用進(jìn)程,得到互為父子關(guān)系的第一應(yīng)用進(jìn)程和第二應(yīng)用進(jìn)程。
在本發(fā)明的一個(gè)實(shí)施例中,所述初始進(jìn)程操作單元還用于:記錄所述第二應(yīng)用進(jìn)程的pid,所述第二應(yīng)用進(jìn)程是所述第一應(yīng)用進(jìn)程的子進(jìn)程;通過查找記錄的所述pid,將所述系統(tǒng)信號(hào)轉(zhuǎn)發(fā)給所記錄的pid對(duì)應(yīng)的所述第二應(yīng)用進(jìn)程。
在本發(fā)明的一個(gè)實(shí)施例中,所述應(yīng)用進(jìn)程處理單元還用于,當(dāng)所述第一應(yīng)用進(jìn)程已終止或退出時(shí),將所述第二應(yīng)用進(jìn)程的父進(jìn)程設(shè)置為所述初始進(jìn)程。
在本發(fā)明的一個(gè)實(shí)施例中,所述初始進(jìn)程操作單元還用于:監(jiān)聽系統(tǒng)信號(hào),確定系統(tǒng)信號(hào)是否包括容器運(yùn)行所處linux環(huán)境的linux內(nèi)核發(fā)送的sigchild信號(hào);所述裝置還包括:資源釋放單元,用于當(dāng)監(jiān)聽到與所述第二應(yīng)用進(jìn)程關(guān)聯(lián)的sigchild信號(hào)時(shí),對(duì)所述第二應(yīng)用進(jìn)程的資源進(jìn)行回收處理。
在本發(fā)明實(shí)施方式的第三方面中,提供了一種計(jì)算機(jī)可讀存儲(chǔ)介質(zhì),其上存儲(chǔ)有計(jì)算機(jī)程序,該程序被處理器執(zhí)行時(shí)實(shí)現(xiàn)docker容器內(nèi)應(yīng)用進(jìn)程管理方法的步驟:設(shè)置初始化進(jìn)程;對(duì)所述初始化進(jìn)程進(jìn)行分叉操作,得到初始進(jìn)程和第一子進(jìn)程;在初始進(jìn)程進(jìn)行系統(tǒng)信號(hào)注冊(cè)操作,通過監(jiān)聽系統(tǒng)信號(hào)并將系統(tǒng)信號(hào)轉(zhuǎn)發(fā)給所述第一子進(jìn)程以及所述第一子進(jìn)程執(zhí)行系統(tǒng)調(diào)用載入到所述docker容器內(nèi)的至少一個(gè)應(yīng)用進(jìn)程,從而對(duì)所述第一子進(jìn)程以及所述至少一個(gè)應(yīng)用進(jìn)程進(jìn)行接管。
在本發(fā)明的一個(gè)實(shí)施例中,該計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)所執(zhí)行的docker容器內(nèi)應(yīng)用進(jìn)程管理方法還包括:在初始進(jìn)程記錄第一子進(jìn)程以及所述至少一個(gè)應(yīng)用進(jìn)程的pid;所述初始進(jìn)程通過查找記錄的所述pid,將所述系統(tǒng)信號(hào)轉(zhuǎn)發(fā)給所記錄的pid對(duì)應(yīng)的所述第一子進(jìn)程和所述至少一個(gè)應(yīng)用進(jìn)程。
在本發(fā)明的一個(gè)實(shí)施例中,該計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)所執(zhí)行的docker容器內(nèi)應(yīng)用進(jìn)程管理方法還包括:在所述初始進(jìn)程將系統(tǒng)信號(hào)轉(zhuǎn)發(fā)給所述第一子進(jìn)程和所述至少一個(gè)應(yīng)用進(jìn)程之后,所述初始進(jìn)程監(jiān)聽系統(tǒng)信號(hào),確定系統(tǒng)信號(hào)是否包括容器運(yùn)行所處linux環(huán)境的linux內(nèi)核發(fā)送的sigchild信號(hào);如果所述初始進(jìn)程監(jiān)聽到與所述第一子進(jìn)程或所述應(yīng)用進(jìn)程關(guān)聯(lián)的sigchild信號(hào),則對(duì)所述第一子進(jìn)程或所述應(yīng)用進(jìn)程的資源進(jìn)行回收處理。
在本發(fā)明的一個(gè)實(shí)施例中,該計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)所執(zhí)行的docker容器內(nèi)應(yīng)用進(jìn)程管理方法包括:設(shè)置所述初始進(jìn)程的pid為1。
在本發(fā)明的一個(gè)實(shí)施例中,該計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)所執(zhí)行的docker容器內(nèi)應(yīng)用進(jìn)程管理方法包括:還包括:在所述第一子進(jìn)程進(jìn)行環(huán)境分離操作,并載入應(yīng)用初始化腳本,從而在所述第一子進(jìn)程執(zhí)行系統(tǒng)調(diào)用,將所述至少一個(gè)應(yīng)用進(jìn)程載入到所述docker容器內(nèi)。
在本發(fā)明的一個(gè)實(shí)施例中,該計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)所執(zhí)行的docker容器內(nèi)應(yīng)用進(jìn)程管理方法還包括:對(duì)其中一個(gè)應(yīng)用進(jìn)程進(jìn)行分叉操作,得到互為父子關(guān)系的第一應(yīng)用進(jìn)程和第二應(yīng)用進(jìn)程,或者,在其中一個(gè)應(yīng)用進(jìn)程中啟動(dòng)另一個(gè)應(yīng)用進(jìn)程,得到互為父子關(guān)系的第一應(yīng)用進(jìn)程和第二應(yīng)用進(jìn)程。
在本發(fā)明的一個(gè)實(shí)施例中,該計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)所執(zhí)行的docker容器內(nèi)應(yīng)用進(jìn)程管理方法還包括:所述初始進(jìn)程記錄所述第二應(yīng)用進(jìn)程的pid,所述第二應(yīng)用進(jìn)程是所述第一應(yīng)用進(jìn)程的子進(jìn)程;所述初始進(jìn)程通過查找記錄的所述pid,將所述系統(tǒng)信號(hào)轉(zhuǎn)發(fā)給所記錄的pid對(duì)應(yīng)的所述第二應(yīng)用進(jìn)程。
在本發(fā)明的一個(gè)實(shí)施例中,該計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)所執(zhí)行的docker容器內(nèi)應(yīng)用進(jìn)程管理方法還包括:當(dāng)所述第一應(yīng)用進(jìn)程已終止或退出時(shí),將所述第二應(yīng)用進(jìn)程的父進(jìn)程設(shè)置為所述初始進(jìn)程。
在本發(fā)明的一個(gè)實(shí)施例中,該計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)所執(zhí)行的docker容器內(nèi)應(yīng)用進(jìn)程管理方法還包括:所述初始進(jìn)程監(jiān)聽系統(tǒng)信號(hào),確定系統(tǒng)信號(hào)是否包括容器運(yùn)行所處linux環(huán)境的linux內(nèi)核發(fā)送的sigchild信號(hào);如果所述初始進(jìn)程監(jiān)聽到所述第二應(yīng)用進(jìn)程關(guān)聯(lián)的sigchild信號(hào),則對(duì)所述第二應(yīng)用進(jìn)程的資源進(jìn)行回收處理。
本發(fā)明實(shí)施例提供的方案相對(duì)于現(xiàn)有的技術(shù)方案,至少存在如下技術(shù)效果:
1、通過將docker容器所支持的應(yīng)用進(jìn)程中第一個(gè)應(yīng)用進(jìn)程設(shè)置為初始化進(jìn)程,并將該初始化進(jìn)程分叉成為初始進(jìn)程和第一子進(jìn)程,并由該初始進(jìn)程進(jìn)行系統(tǒng)信號(hào)注冊(cè)和轉(zhuǎn)發(fā),第一子進(jìn)程和應(yīng)用進(jìn)程能有效的接收和處理系統(tǒng)信號(hào),且初始進(jìn)程能夠接收到與第一子進(jìn)程和應(yīng)用進(jìn)程關(guān)聯(lián)的系統(tǒng)信號(hào),能夠避免出現(xiàn)應(yīng)用進(jìn)程無法通過向外部發(fā)送信號(hào)導(dǎo)致無法控制其終止的問題。
2、通過初始化進(jìn)程的分叉操作,由于初始進(jìn)程在容器內(nèi)pid為1,當(dāng)系統(tǒng)產(chǎn)生孤兒進(jìn)程時(shí),容器運(yùn)行所處linux環(huán)境的linux內(nèi)核會(huì)將該孤兒進(jìn)程交給pid為1的初始進(jìn)程進(jìn)行接管,從而避免孤兒進(jìn)程資源泄漏問題。
3、由于初始進(jìn)程循環(huán)等待第一子進(jìn)程和應(yīng)用進(jìn)程的退出信號(hào),從而可有效避免第一子進(jìn)程和應(yīng)用進(jìn)程出現(xiàn)僵尸進(jìn)程的問題。
附圖說明
通過參考附圖閱讀下文的詳細(xì)描述,本發(fā)明示例性實(shí)施方式的上述以及其他目的、特征和優(yōu)點(diǎn)將變得易于理解。在附圖中,以示例性而非限制性的方式示出了本發(fā)明的若干實(shí)施方式,其中:
圖1示意性地示出了根據(jù)本發(fā)明實(shí)施方式的docker容器內(nèi)應(yīng)用進(jìn)程管理系統(tǒng)示意圖;
圖2示意性地示出了根據(jù)本發(fā)明一實(shí)施例的docker容器內(nèi)應(yīng)用進(jìn)程管理方法流程圖;
圖3示意性地示出了根據(jù)本發(fā)明一實(shí)施例的docker容器內(nèi)應(yīng)用進(jìn)程管理裝置結(jié)構(gòu)示意圖;
圖4示意性地示出了根據(jù)本發(fā)明一實(shí)施例的docker容器內(nèi)應(yīng)用進(jìn)程管理設(shè)備的結(jié)構(gòu)示意圖;
圖5示意性地示出了根據(jù)本發(fā)明一實(shí)施例的docker容器內(nèi)應(yīng)用進(jìn)程管理的程序產(chǎn)品的示意圖
在附圖中,相同或?qū)?yīng)的標(biāo)號(hào)表示相同或?qū)?yīng)的部分。
具體實(shí)施方式
下面將參考若干示例性實(shí)施方式來描述本發(fā)明的原理和精神。應(yīng)當(dāng)理解,給出這些實(shí)施方式僅僅是為了使本領(lǐng)域技術(shù)人員能夠更好地理解進(jìn)而實(shí)現(xiàn)本發(fā)明,而并非以任何方式限制本發(fā)明的范圍。相反,提供這些實(shí)施方式是為了使本公開更加透徹和完整,并且能夠?qū)⒈竟_的范圍完整地傳達(dá)給本領(lǐng)域的技術(shù)人員。
本領(lǐng)域技術(shù)技術(shù)人員知道,本發(fā)明的實(shí)施方式可以實(shí)現(xiàn)為一種系統(tǒng)、裝置、設(shè)備、方法或計(jì)算機(jī)程序產(chǎn)品。因此,本公開可以具體實(shí)現(xiàn)為以下形式,即:完全的硬件、完全的軟件(包括固件、駐留軟件、微代碼等),或者硬件和軟件結(jié)合的形式。
根據(jù)本發(fā)明的實(shí)施方式,提出了一種docker容器內(nèi)應(yīng)用進(jìn)程管理方法和計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)。
在本文中,需要理解的是,對(duì)所涉及的術(shù)語解釋如下:
虛擬化:虛擬化是為一些組件創(chuàng)建基于軟件的或虛擬(而不是物理)表現(xiàn)形式的過程。虛擬化可以應(yīng)用于應(yīng)用、服務(wù)器、存儲(chǔ)和網(wǎng)絡(luò),它是一種可以為所有規(guī)模的企業(yè)降低it開銷,同時(shí)提高效率和敏捷性的有效方式。
docker容器:docker是一種虛擬化技術(shù),讓開發(fā)者可以打包他們的應(yīng)用以及依賴包到一個(gè)可移植的容器中,然后發(fā)布到流行的linux機(jī)器上;docker容器是docker技術(shù)運(yùn)行的單元。
進(jìn)程:進(jìn)程(process)是計(jì)算機(jī)中的程序關(guān)于某數(shù)據(jù)集合上的一次運(yùn)行活動(dòng),是系統(tǒng)進(jìn)行資源分配和調(diào)度的基本單位,是操作系統(tǒng)結(jié)構(gòu)的基礎(chǔ)。
pid:linux進(jìn)程總是會(huì)分配一個(gè)號(hào)碼用于在其命名空間中唯一地標(biāo)識(shí)它們。該號(hào)碼被稱作進(jìn)程id號(hào),簡稱pid。pid在系統(tǒng)內(nèi)唯一。
孤兒進(jìn)程:一個(gè)父進(jìn)程退出,而它的一個(gè)或多個(gè)子進(jìn)程還在運(yùn)行,那么那些子進(jìn)程將成為孤兒進(jìn)程。
僵尸進(jìn)程:一個(gè)進(jìn)程使用fork創(chuàng)建子進(jìn)程,如果子進(jìn)程退出,而父進(jìn)程并沒有調(diào)用wait或waitpid獲取子進(jìn)程的狀態(tài)信息,那么子進(jìn)程的進(jìn)程描述符仍然保存在系統(tǒng)中。這種進(jìn)程稱之為僵尸進(jìn)程。
此外,附圖中的任何元素?cái)?shù)量均用于示例而非限制,以及任何命名都僅用于區(qū)分,而不具有任何限制含義。
下面參考本發(fā)明的若干代表性實(shí)施方式,詳細(xì)闡釋本發(fā)明的原理和精神。
發(fā)明概述
本發(fā)明人發(fā)現(xiàn),由于容器啟動(dòng)時(shí),第一個(gè)啟動(dòng)的進(jìn)程的pid為1,而linux系統(tǒng)對(duì)于pid為1的進(jìn)程有一些特殊的處理,所以會(huì)出現(xiàn)下述問題:
1、因?yàn)檫M(jìn)程需要注冊(cè)系統(tǒng)信號(hào),由此來接收系統(tǒng)發(fā)送的系統(tǒng)信號(hào),例如term信號(hào),并在進(jìn)程退出前進(jìn)行一些資源清理,如果一個(gè)進(jìn)程沒有向系統(tǒng)注冊(cè)term信號(hào),當(dāng)系統(tǒng)發(fā)送term信號(hào)時(shí),內(nèi)核判斷如果該進(jìn)程沒有注冊(cè)term信號(hào),內(nèi)核會(huì)直接殺死該進(jìn)程。但是對(duì)于pid為1的進(jìn)程,內(nèi)核不會(huì)做任何處理。而現(xiàn)有的docker容器中,只有應(yīng)用進(jìn)程,沒有專門的系統(tǒng)初始化進(jìn)程,對(duì)于pid為1的進(jìn)程,并不是必須進(jìn)行系統(tǒng)信號(hào)注冊(cè)的,因此,對(duì)于pid為1的進(jìn)程,如果該進(jìn)程未注冊(cè)任何信號(hào)處理,會(huì)造成該進(jìn)程資源不釋放。
2、如果使用bash方式啟動(dòng)多個(gè)進(jìn)程,當(dāng)其他線程需要接收系統(tǒng)信號(hào)時(shí),當(dāng)shell進(jìn)程從容器系統(tǒng)接收到系統(tǒng)信號(hào)時(shí),并不會(huì)轉(zhuǎn)發(fā)到它的子進(jìn)程即應(yīng)用進(jìn)程中,從而導(dǎo)致應(yīng)用進(jìn)程需要處理信號(hào)時(shí)無法實(shí)現(xiàn)。
3、由于而現(xiàn)有的docker容器中,只有應(yīng)用進(jìn)程,沒有專門的系統(tǒng)初始化進(jìn)程,沒有任何進(jìn)程能夠接管在應(yīng)用進(jìn)程中產(chǎn)生的孤兒進(jìn)程,從而導(dǎo)致孤兒進(jìn)程資源泄露。
基于上述分析,本發(fā)明為了對(duì)docker容器內(nèi)應(yīng)用進(jìn)程進(jìn)行管理,通過設(shè)置一個(gè)初始化進(jìn)程,并利用該初始化進(jìn)程進(jìn)行系統(tǒng)信號(hào)注冊(cè),繼而將系統(tǒng)信號(hào)轉(zhuǎn)發(fā)給應(yīng)用進(jìn)程,從而實(shí)現(xiàn)對(duì)應(yīng)用進(jìn)程的管理。
在介紹了本發(fā)明的基本原理之后,下面具體介紹本發(fā)明的各種非限制性實(shí)施方式。
應(yīng)用場景總覽
為了解決現(xiàn)有方案中存在的進(jìn)程資源不釋放、孤兒進(jìn)程資源泄漏等問題,本發(fā)明通過實(shí)現(xiàn)一個(gè)初始化進(jìn)程,并對(duì)初始化進(jìn)程進(jìn)行分叉操作得到初始進(jìn)程和第一子進(jìn)程,由初始進(jìn)程進(jìn)行系統(tǒng)信號(hào)注冊(cè),并通過監(jiān)聽系統(tǒng)信號(hào)實(shí)現(xiàn)對(duì)第一子進(jìn)程載入的應(yīng)用進(jìn)程進(jìn)行接管。
請(qǐng)參考圖1,為本發(fā)明docker容器內(nèi)應(yīng)用進(jìn)程管理系統(tǒng)示意圖,本發(fā)明應(yīng)用場景包括但不限于應(yīng)用程序開發(fā)。下面結(jié)合圖1,對(duì)各個(gè)部分/流程介紹如下。
s1、docker容器啟動(dòng),運(yùn)行初始化進(jìn)程。
初始化進(jìn)程是自定義的一個(gè)進(jìn)程,將docker容器中所支持的應(yīng)用進(jìn)程中的第一個(gè)進(jìn)程定義為初始化進(jìn)程,通過對(duì)該初始化進(jìn)程的后續(xù)處理(例如分叉操作、初始進(jìn)程注冊(cè)系統(tǒng)信號(hào)、由初始進(jìn)程將系統(tǒng)信號(hào)轉(zhuǎn)發(fā)給第一子進(jìn)程和第一子進(jìn)程載入的應(yīng)用進(jìn)程,等等),實(shí)現(xiàn)在docker容器內(nèi)對(duì)應(yīng)用進(jìn)程的管理。
s2、對(duì)初始化進(jìn)程進(jìn)行分叉操作。
本領(lǐng)域技術(shù)人員了解,分叉(fork)是unix中的一個(gè)操作,當(dāng)分叉一個(gè)進(jìn)程時(shí),基本上是復(fù)制了它,并且分叉后的兩個(gè)進(jìn)程都從當(dāng)前的執(zhí)行點(diǎn)繼續(xù)運(yùn)行,并且每個(gè)進(jìn)程都有自己的內(nèi)存副本(比如變量)。一個(gè)進(jìn)程(原來的那個(gè))成為父進(jìn)程,另一個(gè)(復(fù)制的)成為子進(jìn)程。例如,內(nèi)核會(huì)復(fù)制和當(dāng)前進(jìn)程一樣的進(jìn)程運(yùn)行,新進(jìn)程與原有進(jìn)程包含相同的數(shù)據(jù),比如變量,環(huán)境變量,程序計(jì)數(shù)器等。復(fù)制出來的進(jìn)程為子進(jìn)程,原有運(yùn)行的進(jìn)程則為子進(jìn)程的父進(jìn)程。
分叉操作在時(shí)間線(timeline)上創(chuàng)建了一個(gè)分支,最后得到了兩個(gè)獨(dú)立存在的進(jìn)程。通過查看fork函數(shù)的返回值可以判斷哪個(gè)是原進(jìn)程哪個(gè)是子進(jìn)程,繼而區(qū)分父進(jìn)程和子進(jìn)程,使得父進(jìn)程和子進(jìn)程后續(xù)所執(zhí)行的操作不同。
本發(fā)明中,初始化進(jìn)程執(zhí)行分叉操作之后,得到一個(gè)初始進(jìn)程和一個(gè)第一子進(jìn)程。其中,初始進(jìn)程可以理解為原來的初始化進(jìn)程,而第一子進(jìn)程為分支的進(jìn)程,初始進(jìn)程和第一子進(jìn)程是互為獨(dú)立的兩個(gè)進(jìn)程。在后續(xù)流程中,初始進(jìn)程執(zhí)行s3-s6的步驟,而第一子進(jìn)程執(zhí)行s7-s9的步驟。
初始進(jìn)程執(zhí)行s3-s6的步驟如下:
s3、記錄第一子進(jìn)程pid以及第一子進(jìn)程載入的應(yīng)用進(jìn)程的pid。
初始進(jìn)程記錄第一子進(jìn)程pid(portid)的目的在于將后續(xù)監(jiān)聽到的系統(tǒng)信號(hào)轉(zhuǎn)發(fā)給第一子進(jìn)程,同理,記錄其他應(yīng)用進(jìn)程的pid的目的在于將后續(xù)監(jiān)聽到的系統(tǒng)信號(hào)轉(zhuǎn)發(fā)給其他應(yīng)用進(jìn)程。其中,pid是進(jìn)程id號(hào),在系統(tǒng)內(nèi)是唯一的。例如,本發(fā)明中,初始進(jìn)程的pid一般為1,第一子進(jìn)程的pid為2,對(duì)于第一子進(jìn)程執(zhí)行系統(tǒng)調(diào)用載入到所述docker容器內(nèi)的至少一個(gè)應(yīng)用進(jìn)程,其pid依次為3、4等,以此類推。
s4、向docker容器所運(yùn)行的linux環(huán)境的linux內(nèi)核注冊(cè)系統(tǒng)信號(hào)。
在linux中,信號(hào)是進(jìn)程間通訊的一種方式,它采用的是異步機(jī)制。當(dāng)信號(hào)發(fā)送到某個(gè)進(jìn)程中時(shí),操作系統(tǒng)會(huì)中斷該進(jìn)程的正常流程,并進(jìn)入相應(yīng)的信號(hào)處理函數(shù)執(zhí)行操作,完成后再返回到中斷的地方繼續(xù)執(zhí)行。
每個(gè)信號(hào)(以信號(hào)值1、2、3、…進(jìn)行區(qū)分)都有自己的響應(yīng)動(dòng)作,當(dāng)接收到信號(hào)時(shí),進(jìn)程會(huì)根據(jù)信號(hào)的響應(yīng)動(dòng)作執(zhí)行相應(yīng)的操作,信號(hào)的響應(yīng)動(dòng)作例如可以為:中止信號(hào)(term)、忽略信號(hào)(ign)、中止進(jìn)程并保存內(nèi)存信息(core)、停止進(jìn)程(stop)、繼續(xù)運(yùn)行進(jìn)程(cont)等。
s5、循環(huán)監(jiān)聽所述linux內(nèi)核系統(tǒng)信號(hào),并向第一子進(jìn)程以及第一子進(jìn)程所載入的應(yīng)用進(jìn)程進(jìn)行系統(tǒng)信號(hào)轉(zhuǎn)發(fā)。
在s4進(jìn)行系統(tǒng)信號(hào)注冊(cè)的目的是,可以在s5監(jiān)聽系統(tǒng)信號(hào)并將系統(tǒng)信號(hào)轉(zhuǎn)發(fā)給第一子進(jìn)程以及第一子進(jìn)程所載入的應(yīng)用進(jìn)程,從而使第一子進(jìn)程以及應(yīng)用進(jìn)程能夠有效的接收和處理系統(tǒng)信號(hào),另外,在第一子進(jìn)程和應(yīng)用進(jìn)程主動(dòng)退出時(shí),可以通過向內(nèi)核發(fā)送退出請(qǐng)求來實(shí)現(xiàn),同時(shí)使得初始進(jìn)程釋放該第一子進(jìn)程或應(yīng)用進(jìn)程的相關(guān)資源。
s6、等待第一子進(jìn)程以及其他應(yīng)用進(jìn)程的退出信號(hào)。
當(dāng)?shù)谝蛔舆M(jìn)程或其他應(yīng)用進(jìn)程需要退出時(shí),向內(nèi)核發(fā)起退出請(qǐng)求,然后內(nèi)核向發(fā)起退出請(qǐng)求的第一子進(jìn)程或其他應(yīng)用進(jìn)程的父進(jìn)程發(fā)出sigchild信號(hào),由第一子進(jìn)程或其他應(yīng)用進(jìn)程的父進(jìn)程釋放掉該請(qǐng)求退出的進(jìn)程的資源。
因此,本發(fā)明方式中,由初始進(jìn)程監(jiān)聽內(nèi)核發(fā)出的sigchild信號(hào);初始進(jìn)程監(jiān)聽到第一子進(jìn)程或其他應(yīng)用進(jìn)程關(guān)聯(lián)的sigchild信號(hào)時(shí),會(huì)釋放掉該第一子進(jìn)程或其他應(yīng)用進(jìn)程的相關(guān)資源。
第一子進(jìn)程執(zhí)行s7-s9的步驟如下:
s7、分配第一子進(jìn)程pid。
如前所述,第一子進(jìn)程pid一般為2。
s8、運(yùn)行環(huán)境分離。
例如,由于第一子進(jìn)程和初始進(jìn)程分叉時(shí),他們的環(huán)境變量是完全一樣的,后續(xù),第一子進(jìn)程運(yùn)行環(huán)境分離的過程,運(yùn)行環(huán)境是指進(jìn)程內(nèi)的變量,運(yùn)行代碼,環(huán)境變量等環(huán)境,通過分離之后就可以與初始進(jìn)程運(yùn)行不同的代碼邏輯。
s9、載入應(yīng)用程序初始化腳本,從而載入其他應(yīng)用程序(例如載入應(yīng)用進(jìn)程1、應(yīng)用進(jìn)程2,等等)。
示例性方法
下面結(jié)合圖1的應(yīng)用場景,參考圖2來描述根據(jù)本發(fā)明示例性實(shí)施方式的用于應(yīng)用程序開發(fā)中docker容器內(nèi)應(yīng)用進(jìn)程管理方法。需要注意的是,上述應(yīng)用場景僅是為了便于理解本發(fā)明的精神和原理而示出,本發(fā)明的實(shí)施方式在此方面不受任何限制。相反,本發(fā)明的實(shí)施方式可以應(yīng)用于適用的任何場景。
圖2示出了docker容器內(nèi)應(yīng)用進(jìn)程管理方法流程圖,其中步驟s201、s202、s203是必須執(zhí)行的步驟,步驟s204是可選步驟,分別在圖中以實(shí)線框和虛線框表示。
s201:設(shè)置初始化進(jìn)程。
初始化進(jìn)程是自定義的一個(gè)初始進(jìn)程,將docker容器中所支持的應(yīng)用進(jìn)程中的第一個(gè)進(jìn)程定義為初始化進(jìn)程,通過對(duì)該初始化進(jìn)程的后續(xù)處理(例如分叉操作、初始進(jìn)程注冊(cè)系統(tǒng)信號(hào)、由初始進(jìn)程將系統(tǒng)信號(hào)轉(zhuǎn)發(fā)給第一子進(jìn)程和第一子進(jìn)程載入的應(yīng)用進(jìn)程,等等),實(shí)現(xiàn)在docker容器內(nèi)對(duì)應(yīng)用進(jìn)程的管理。
s202:對(duì)初始化進(jìn)程進(jìn)行分叉操作,得到初始進(jìn)程和第一子進(jìn)程。
初始化進(jìn)程執(zhí)行分叉操作之后,得到一個(gè)初始進(jìn)程和一個(gè)第一子進(jìn)程。其中,初始進(jìn)程可以理解為原來的初始化進(jìn)程,而第一子進(jìn)程為分支的進(jìn)程,初始進(jìn)程和第一子進(jìn)程是互為獨(dú)立的兩個(gè)進(jìn)程。
初始進(jìn)程記錄第一子進(jìn)程pid(portid)的目的在于將后續(xù)監(jiān)聽到的系統(tǒng)信號(hào)轉(zhuǎn)發(fā)給第一子進(jìn)程。其中,pid是進(jìn)程id號(hào),在系統(tǒng)內(nèi)是唯一的。例如,本發(fā)明的一個(gè)優(yōu)選方式中,初始進(jìn)程的pid一般為1,第一子進(jìn)程的pid為2。對(duì)于第一子進(jìn)程執(zhí)行系統(tǒng)調(diào)用載入到所述docker容器內(nèi)的至少一個(gè)應(yīng)用進(jìn)程,其pid依次為3、4等。初始進(jìn)程亦會(huì)記錄這些進(jìn)程的pid。。
在本發(fā)明的一個(gè)優(yōu)選方式中,在第一子進(jìn)程進(jìn)行環(huán)境分離操作,并載入應(yīng)用初始化腳本,從而在第一子進(jìn)程執(zhí)行系統(tǒng)調(diào)用,將至少一個(gè)應(yīng)用進(jìn)程載入到docker容器內(nèi)。
s203:在初始進(jìn)程進(jìn)行系統(tǒng)信號(hào)注冊(cè)操作,通過監(jiān)聽系統(tǒng)信號(hào)并將系統(tǒng)信號(hào)轉(zhuǎn)發(fā)給第一子進(jìn)程以及第一子進(jìn)程執(zhí)行系統(tǒng)調(diào)用載入到docker容器內(nèi)的至少一個(gè)應(yīng)用進(jìn)程,從而對(duì)第一子進(jìn)程以及所述至少一個(gè)應(yīng)用進(jìn)程進(jìn)行接管。
在本發(fā)明的一個(gè)優(yōu)選方式中,為了在初始進(jìn)程將系統(tǒng)信號(hào)轉(zhuǎn)發(fā)給第一子進(jìn)程以及第一子進(jìn)程所載入的應(yīng)用進(jìn)程,初始進(jìn)程需要記錄第一子進(jìn)程以及所述應(yīng)用進(jìn)程的pid??梢?,上述方法還包括如下步驟:在初始進(jìn)程記錄第一子進(jìn)程以及至少一個(gè)應(yīng)用進(jìn)程的pid;初始進(jìn)程通過查找記錄的pid,將系統(tǒng)信號(hào)轉(zhuǎn)發(fā)給所記錄的pid對(duì)應(yīng)的第一子進(jìn)程和至少一個(gè)應(yīng)用進(jìn)程。
s204:初始進(jìn)程監(jiān)聽系統(tǒng)信號(hào),確定系統(tǒng)信號(hào)是否包括linux內(nèi)核發(fā)送的sigchild信號(hào);如果監(jiān)聽到與第一子進(jìn)程或所述應(yīng)用進(jìn)程關(guān)聯(lián)的sigchild信號(hào),則對(duì)第一子進(jìn)程或所述應(yīng)用進(jìn)程的資源進(jìn)行回收處理。
本發(fā)明實(shí)施例中,初始進(jìn)程進(jìn)行系統(tǒng)信號(hào)注冊(cè)和監(jiān)聽的目的是,可以將系統(tǒng)信號(hào)轉(zhuǎn)發(fā)給第一子進(jìn)程以及第一子進(jìn)程所載入的應(yīng)用進(jìn)程,從而使第一子進(jìn)程以及其他應(yīng)用進(jìn)程能夠有效的接收和處理系統(tǒng)信號(hào),另外,在第一子進(jìn)程和其他應(yīng)用進(jìn)程主動(dòng)退出時(shí),可以通過內(nèi)核向初始進(jìn)程發(fā)送sigchild信號(hào)來實(shí)現(xiàn),從而使得初始進(jìn)程釋放該第一子進(jìn)程或應(yīng)用進(jìn)程相關(guān)資源。
具體的,所述接收到所述退出信號(hào)時(shí),相應(yīng)的釋放所述第一子進(jìn)程或應(yīng)用進(jìn)程的資源的具體過程包括:初始進(jìn)程監(jiān)聽系統(tǒng)信號(hào),確定系統(tǒng)信號(hào)是否包括linux內(nèi)核發(fā)送的sigchild信號(hào);如果所述初始進(jìn)程監(jiān)聽到內(nèi)核發(fā)送的第一子進(jìn)程或其他應(yīng)用進(jìn)程關(guān)聯(lián)的sigchild信號(hào),則對(duì)該第一子進(jìn)程或其他應(yīng)用進(jìn)程的資源進(jìn)行回收處理。
在一個(gè)優(yōu)選方式中,對(duì)其中一個(gè)應(yīng)用進(jìn)程進(jìn)行分叉操作,得到互為父子關(guān)系的第一應(yīng)用進(jìn)程和第二應(yīng)用進(jìn)程,或者,在其中一個(gè)應(yīng)用進(jìn)程中啟動(dòng)另一個(gè)應(yīng)用進(jìn)程,得到互為父子關(guān)系的第一應(yīng)用進(jìn)程和第二應(yīng)用進(jìn)程。這里,第二應(yīng)用進(jìn)程是第一應(yīng)用進(jìn)程的子進(jìn)程。
對(duì)于該第二應(yīng)用進(jìn)程,初始進(jìn)程會(huì)記錄該第二應(yīng)用進(jìn)程的pid;并且,初始進(jìn)程通過查找記錄的pid,將系統(tǒng)信號(hào)轉(zhuǎn)發(fā)給所記錄的pid對(duì)應(yīng)的第二應(yīng)用進(jìn)程。
另外,現(xiàn)有的docker容器有可能出現(xiàn)孤兒進(jìn)程的問題,下面詳細(xì)分析原因及本發(fā)明的解決方式。
如前已描述的,孤兒進(jìn)程的含義是,當(dāng)一個(gè)父進(jìn)程退出,而它的一個(gè)或多個(gè)子進(jìn)程還在運(yùn)行,那么那些子進(jìn)程將成為孤兒進(jìn)程。那么,如果第一應(yīng)用進(jìn)程退出,而第二應(yīng)用進(jìn)程還在運(yùn)行,則第二應(yīng)用進(jìn)程則會(huì)成為孤兒進(jìn)程。如果沒有任何進(jìn)程接管孤兒進(jìn)程,在孤兒進(jìn)程退出時(shí),沒有其父進(jìn)程來回收資源,則會(huì)造成孤兒進(jìn)程的資源泄漏。
因此,在本發(fā)明的一個(gè)優(yōu)選方式中,當(dāng)?shù)谝粦?yīng)用進(jìn)程已終止或退出時(shí),將所述第二應(yīng)用進(jìn)程的父進(jìn)程設(shè)置為所述初始進(jìn)程,即將所述第二應(yīng)用進(jìn)程的父進(jìn)程設(shè)置為pid為1的進(jìn)程,由此在該第二應(yīng)用進(jìn)程退出時(shí),可以由初始進(jìn)程進(jìn)行資源回收。具體為,初始進(jìn)程監(jiān)聽系統(tǒng)信號(hào),確定系統(tǒng)信號(hào)是否包括容器運(yùn)行所處linux環(huán)境的linux內(nèi)核發(fā)送的sigchild信號(hào);如果初始進(jìn)程監(jiān)聽到第二應(yīng)用進(jìn)程關(guān)聯(lián)的sigchild信號(hào),則對(duì)第二應(yīng)用進(jìn)程的資源進(jìn)行回收處理。
可見,正常情況下,如果一個(gè)進(jìn)程要退出,它向內(nèi)核提出請(qǐng)求,并由內(nèi)核向它的父進(jìn)程發(fā)送sigchld信號(hào)。如果在該進(jìn)程發(fā)起退出請(qǐng)求時(shí),它的父進(jìn)程已經(jīng)提前退出或終止了,則沒有進(jìn)程對(duì)該進(jìn)程關(guān)聯(lián)的sigchld信號(hào)進(jìn)行接收并處理,則造成該進(jìn)程成為孤兒進(jìn)程的問題。本發(fā)明一個(gè)方式中,如果出現(xiàn)上述情況,即一個(gè)進(jìn)程要退出時(shí)它的父進(jìn)程已經(jīng)提前退出或終止了,則由初始進(jìn)程接收它關(guān)聯(lián)的sigchld信號(hào),并對(duì)該進(jìn)程的資源進(jìn)行釋放??梢姡@種處理方式可以避免現(xiàn)有技術(shù)中孤兒進(jìn)程資源無法釋放的問題。
可見,本發(fā)明實(shí)施例至少具有以下技術(shù)優(yōu)點(diǎn):
1、通過將docker容器所支持的應(yīng)用進(jìn)程中第一個(gè)應(yīng)用進(jìn)程設(shè)置為初始化進(jìn)程,并將該初始化進(jìn)程分叉成為初始進(jìn)程和第一子進(jìn)程,并由該初始進(jìn)程進(jìn)行系統(tǒng)信號(hào)注冊(cè)和轉(zhuǎn)發(fā),第一子進(jìn)程和應(yīng)用進(jìn)程能有效的接收和處理系統(tǒng)信號(hào),同時(shí)初始進(jìn)程也能夠接收內(nèi)核發(fā)送的有關(guān)第一子進(jìn)程和應(yīng)用進(jìn)程關(guān)聯(lián)的系統(tǒng)信號(hào),從而能夠避免出現(xiàn)應(yīng)用進(jìn)程無法通過向外部發(fā)送信號(hào)導(dǎo)致無法控制其終止的問題。
2、通過初始化進(jìn)程的分叉操作,由于初始進(jìn)程在容器內(nèi)pid為1,當(dāng)系統(tǒng)產(chǎn)生孤兒進(jìn)程時(shí),容器運(yùn)行所處linux環(huán)境的linux內(nèi)核會(huì)將該孤兒進(jìn)程交給pid為1的初始進(jìn)程進(jìn)行接管,從而避免孤兒進(jìn)程資源泄漏問題。
3、由于初始進(jìn)程循環(huán)等待第一子進(jìn)程和應(yīng)用進(jìn)程的退出信號(hào),從而可有效避免第一子進(jìn)程和應(yīng)用進(jìn)程出現(xiàn)僵尸進(jìn)程的問題。同理,對(duì)于應(yīng)用進(jìn)程進(jìn)一步分叉出來的第二應(yīng)用進(jìn)程等,也可以同樣避免出現(xiàn)僵尸進(jìn)程的問題。
示例性裝置
在介紹了本發(fā)明示例性實(shí)施方式的方法之后,接下來,參考圖3對(duì)本發(fā)明示例性實(shí)施方式的、用于docker容器內(nèi)應(yīng)用進(jìn)程管理裝置進(jìn)行說明。
該docker容器內(nèi)應(yīng)用進(jìn)程管理裝置至少包括初始化單元301、分叉操作單元302和初始進(jìn)程操作單元303。
初始化單元301,用于設(shè)置初始化進(jìn)程。
初始化進(jìn)程是自定義的一個(gè)初始進(jìn)程,將docker容器中所支持的應(yīng)用進(jìn)程中的第一個(gè)進(jìn)程定義為初始化進(jìn)程,通過對(duì)該初始進(jìn)程的后續(xù)處理(例如分叉操作、初始進(jìn)程注冊(cè)系統(tǒng)信號(hào)、由初始進(jìn)程將系統(tǒng)信號(hào)轉(zhuǎn)發(fā)給第一子進(jìn)程和第一子進(jìn)程載入的應(yīng)用進(jìn)程,等等),實(shí)現(xiàn)在docker容器內(nèi)對(duì)應(yīng)用進(jìn)程的管理。
分叉操作單元302,用于對(duì)所述初始化進(jìn)程進(jìn)行分叉操作,得到初始進(jìn)程和第一子進(jìn)程。
本領(lǐng)域技術(shù)人員了解,分叉(fork)是unix中的一個(gè)操作,當(dāng)分叉一個(gè)進(jìn)程時(shí),基本上是復(fù)制了它,并且分叉后的兩個(gè)進(jìn)程都從當(dāng)前的執(zhí)行點(diǎn)繼續(xù)運(yùn)行,并且每個(gè)進(jìn)程都有自己的內(nèi)存副本(比如變量)。一個(gè)進(jìn)程(原來的那個(gè))成為父進(jìn)程,另一個(gè)(復(fù)制的)成為子進(jìn)程。例如,內(nèi)核會(huì)復(fù)制和當(dāng)前進(jìn)程一樣的進(jìn)程運(yùn)行,新進(jìn)程與原有進(jìn)程包含相同的數(shù)據(jù),比如變量,環(huán)境變量,程序計(jì)數(shù)器等。復(fù)制出來的進(jìn)程為子進(jìn)程,原有運(yùn)行的進(jìn)程則為子進(jìn)程的父進(jìn)程。
分叉操作在時(shí)間線(timeline)上創(chuàng)建了一個(gè)分支,最后得到了兩個(gè)獨(dú)立存在的進(jìn)程。通過查看fork函數(shù)的返回值可以判斷哪個(gè)是原進(jìn)程哪個(gè)是子進(jìn)程,繼而區(qū)分父進(jìn)程和子進(jìn)程,使得父進(jìn)程和子進(jìn)程后續(xù)所執(zhí)行的操作不同。
本發(fā)明中,初始化進(jìn)程執(zhí)行分叉操作之后,得到一個(gè)初始進(jìn)程和一個(gè)第一子進(jìn)程。其中,初始進(jìn)程可以理解為原來的初始化進(jìn)程,而第一子進(jìn)程為分支的進(jìn)程,初始進(jìn)程和第一子進(jìn)程是互為獨(dú)立的兩個(gè)進(jìn)程。
初始進(jìn)程操作單元303,用于在初始進(jìn)程進(jìn)行系統(tǒng)信號(hào)注冊(cè)操作,通過監(jiān)聽系統(tǒng)信號(hào)并將系統(tǒng)信號(hào)轉(zhuǎn)發(fā)給所述第一子進(jìn)程以及所述第一子進(jìn)程執(zhí)行系統(tǒng)調(diào)用載入到所述docker容器內(nèi)的至少一個(gè)應(yīng)用進(jìn)程,從而對(duì)所述第一子進(jìn)程以及所述至少一個(gè)應(yīng)用進(jìn)程進(jìn)行接管。
在linux中,信號(hào)是進(jìn)程間通訊的一種方式,它采用的是異步機(jī)制。當(dāng)信號(hào)發(fā)送到某個(gè)進(jìn)程中時(shí),操作系統(tǒng)會(huì)中斷該進(jìn)程的正常流程,并進(jìn)入相應(yīng)的信號(hào)處理函數(shù)執(zhí)行操作,完成后再返回到中斷的地方繼續(xù)執(zhí)行。
每個(gè)信號(hào)(以信號(hào)值1、2、3、…進(jìn)行區(qū)分)都有自己的響應(yīng)動(dòng)作,當(dāng)接收到信號(hào)時(shí),進(jìn)程會(huì)根據(jù)信號(hào)的響應(yīng)動(dòng)作執(zhí)行相應(yīng)的操作,信號(hào)的響應(yīng)動(dòng)作可以包括:中止信號(hào)(term)、忽略信號(hào)(ign)、中止進(jìn)程并保存內(nèi)存信息(core)、停止進(jìn)程(stop)、繼續(xù)運(yùn)行進(jìn)程(cont)。
進(jìn)行系統(tǒng)信號(hào)注冊(cè)的目的是,可以監(jiān)聽系統(tǒng)信號(hào)并將系統(tǒng)信號(hào)轉(zhuǎn)發(fā)給第一子進(jìn)程以及第一子進(jìn)程所載入的應(yīng)用進(jìn)程,從而使第一子進(jìn)程以及應(yīng)用進(jìn)程能夠有效的接收和處理系統(tǒng)信號(hào),另外,在第一子進(jìn)程和應(yīng)用進(jìn)程主動(dòng)退出時(shí),可以通過向初始進(jìn)程發(fā)送退出信號(hào)來實(shí)現(xiàn),同時(shí)使得初始進(jìn)程釋放該第一子進(jìn)程或應(yīng)用進(jìn)程相關(guān)資源。
在一個(gè)優(yōu)選方式中,所述初始進(jìn)程操作單元303還用于:在初始進(jìn)程記錄第一子進(jìn)程以及所述至少一個(gè)應(yīng)用進(jìn)程的pid;所述初始進(jìn)程通過查找記錄的所述pid,將所述系統(tǒng)信號(hào)轉(zhuǎn)發(fā)給所記錄的pid對(duì)應(yīng)的所述第一子進(jìn)程和所述至少一個(gè)應(yīng)用進(jìn)程。
初始進(jìn)程記錄第一子進(jìn)程pid(portid)的目的在于將后續(xù)監(jiān)聽到的系統(tǒng)信號(hào)轉(zhuǎn)發(fā)給第一子進(jìn)程,同理,記錄其他應(yīng)用進(jìn)程的pid的目的在于將后續(xù)監(jiān)聽到的系統(tǒng)信號(hào)轉(zhuǎn)發(fā)給其他應(yīng)用進(jìn)程。其中,pid是進(jìn)程id號(hào),在系統(tǒng)內(nèi)是唯一的。例如,本發(fā)明中,初始進(jìn)程的pid一般為1,第一子進(jìn)程的pid為2,對(duì)于第一子進(jìn)程執(zhí)行系統(tǒng)調(diào)用載入到所述docker容器內(nèi)的至少一個(gè)應(yīng)用進(jìn)程,其pid依此為3、4等,以此類推。
在一個(gè)優(yōu)選方式中,初始進(jìn)程操作單元303還用于:監(jiān)聽系統(tǒng)信號(hào),確定系統(tǒng)信號(hào)是否包括容器運(yùn)行所處linux環(huán)境的linux內(nèi)核發(fā)送的sigchild信號(hào);所述裝置還包括:資源釋放單元304,用于當(dāng)監(jiān)聽到與所述第一子進(jìn)程或所述應(yīng)用進(jìn)程關(guān)聯(lián)的sigchild信號(hào)時(shí),對(duì)所述第一子進(jìn)程或所述應(yīng)用進(jìn)程的資源進(jìn)行回收處理。
在一個(gè)優(yōu)選方式中,所述初始進(jìn)程操作單元303還用于:設(shè)置所述初始進(jìn)程的pid為1。
在一個(gè)優(yōu)選方式中,該裝置還包括:子進(jìn)程操作單元305,用于在所述第一子進(jìn)程進(jìn)行環(huán)境分離操作,并載入應(yīng)用初始化腳本,從而在所述第一子進(jìn)程執(zhí)行系統(tǒng)調(diào)用,將所述至少一個(gè)應(yīng)用進(jìn)程載入到所述docker容器內(nèi)。
例如,由于第一子進(jìn)程和初始進(jìn)程分叉時(shí),他們的環(huán)境變量是完全一樣的,后續(xù),第一子進(jìn)程運(yùn)行環(huán)境分離的過程,運(yùn)行環(huán)境是指進(jìn)程內(nèi)的變量,運(yùn)行代碼,環(huán)境變量等環(huán)境,通過分離之后就可以與初始進(jìn)程運(yùn)行不同的代碼邏輯。
在一個(gè)優(yōu)選方式中,還包括:應(yīng)用進(jìn)程處理單元306,用于對(duì)其中一個(gè)應(yīng)用進(jìn)程進(jìn)行分叉操作,得到互為父子關(guān)系的第一應(yīng)用進(jìn)程和第二應(yīng)用進(jìn)程,或者,在其中一個(gè)應(yīng)用進(jìn)程中啟動(dòng)另一個(gè)應(yīng)用進(jìn)程,得到互為父子關(guān)系的第一應(yīng)用進(jìn)程和第二應(yīng)用進(jìn)程。
在一個(gè)優(yōu)選方式中,所述初始進(jìn)程操作單元303還用于:記錄所述第二應(yīng)用進(jìn)程的pid,所述第二應(yīng)用進(jìn)程是所述第一應(yīng)用進(jìn)程的子進(jìn)程;通過查找記錄的所述pid,將所述系統(tǒng)信號(hào)轉(zhuǎn)發(fā)給所記錄的pid對(duì)應(yīng)的所述第二應(yīng)用進(jìn)程。
另外,現(xiàn)有的docker容器有可能出現(xiàn)孤兒進(jìn)程的問題,下面詳細(xì)分析原因及本發(fā)明的解決方式。
如前已描述的,孤兒進(jìn)程的含義是,當(dāng)一個(gè)父進(jìn)程退出,而它的一個(gè)或多個(gè)子進(jìn)程還在運(yùn)行,那么那些子進(jìn)程將成為孤兒進(jìn)程。那么,如果第一應(yīng)用進(jìn)程退出,而第二應(yīng)用進(jìn)程還在運(yùn)行,則第二應(yīng)用進(jìn)程則會(huì)成為孤兒進(jìn)程。如果沒有任何進(jìn)程接管孤兒進(jìn)程,在孤兒進(jìn)程退出時(shí),沒有其父進(jìn)程來回收資源,則會(huì)造成孤兒進(jìn)程的資源泄漏。
因此,在本發(fā)明的一個(gè)優(yōu)選方式中,當(dāng)?shù)谝粦?yīng)用進(jìn)程已終止或退出時(shí),將所述第二應(yīng)用進(jìn)程的父進(jìn)程設(shè)置為所述初始進(jìn)程,即將所述第二應(yīng)用進(jìn)程的父進(jìn)程設(shè)置為pid為1的進(jìn)程,由此在該第二應(yīng)用進(jìn)程退出時(shí),可以由初始進(jìn)程進(jìn)行資源回收。
具體的,所述應(yīng)用進(jìn)程處理單元306還用于,當(dāng)所述第一應(yīng)用進(jìn)程已終止或退出時(shí),將所述第二應(yīng)用進(jìn)程的父進(jìn)程設(shè)置為所述初始進(jìn)程。所述初始進(jìn)程操作單元303還用于:監(jiān)聽系統(tǒng)信號(hào),確定系統(tǒng)信號(hào)是否包括容器運(yùn)行所處linux環(huán)境的linux內(nèi)核發(fā)送的sigchild信號(hào);所述裝置還包括:資源釋放單元304,用于當(dāng)監(jiān)聽到與所述第二應(yīng)用進(jìn)程關(guān)聯(lián)的sigchild信號(hào)時(shí),對(duì)所述第二應(yīng)用進(jìn)程的資源進(jìn)行回收處理。
圖3示出的docker容器內(nèi)應(yīng)用進(jìn)程管理裝置結(jié)構(gòu)示意圖中,其中初始化單元301、分叉操作單元302和初始進(jìn)程操作單元303是必選單元,資源釋放單元304、子進(jìn)程操作單元305、應(yīng)用進(jìn)程處理單元306是可選單元,分別在圖中以實(shí)線框和虛線框表示。
示例性設(shè)備
在介紹了本發(fā)明示例性實(shí)施方式的方法和裝置之后,接下來,介紹根據(jù)本發(fā)明的另一示例性實(shí)施方式的docker容器內(nèi)應(yīng)用進(jìn)程管理設(shè)備。
所屬技術(shù)領(lǐng)域的技術(shù)人員能夠理解,本發(fā)明的各個(gè)方面可以實(shí)現(xiàn)為系統(tǒng)、方法或程序產(chǎn)品。因此,本發(fā)明的各個(gè)方面可以具體實(shí)現(xiàn)為以下形式,即:完全的硬件實(shí)施方式、完全的軟件實(shí)施方式(包括固件、微代碼等),或硬件和軟件方面結(jié)合的實(shí)施方式,這里可以統(tǒng)稱為“電路”、“模塊”或“系統(tǒng)”。
在一些可能的實(shí)施方式中,根據(jù)本發(fā)明的docker容器內(nèi)應(yīng)用進(jìn)程管理設(shè)備可以至少包括至少一個(gè)處理單元、以及至少一個(gè)存儲(chǔ)單元。其中,所述存儲(chǔ)單元存儲(chǔ)有程序代碼,當(dāng)所述程序代碼被所述處理單元執(zhí)行時(shí),使得所述處理單元執(zhí)行本說明書上述“示例性方法”部分中描述的根據(jù)本發(fā)明各種示例性實(shí)施方式的docker容器內(nèi)應(yīng)用進(jìn)程管理方法中的步驟。例如,所述處理單元可以執(zhí)行如圖2所示的步驟s201,設(shè)置初始化進(jìn)程;步驟s202,初始化進(jìn)程進(jìn)行分叉操作,得到初始進(jìn)程和第一子進(jìn)程;步驟s203,在初始進(jìn)程進(jìn)行系統(tǒng)信號(hào)注冊(cè)操作,通過監(jiān)聽系統(tǒng)信號(hào)并將系統(tǒng)信號(hào)轉(zhuǎn)發(fā)給第一子進(jìn)程以及第一子進(jìn)程執(zhí)行系統(tǒng)調(diào)用載入到docker容器內(nèi)的至少一個(gè)應(yīng)用進(jìn)程,從而對(duì)第一子進(jìn)程以及所述至少一個(gè)應(yīng)用進(jìn)程進(jìn)行接管。
下面參考圖4來描述根據(jù)本發(fā)明的這種實(shí)施方式的docker容器內(nèi)應(yīng)用進(jìn)程管理設(shè)備40。圖4顯示的docker容器內(nèi)應(yīng)用進(jìn)程管理設(shè)備40僅僅是一個(gè)示例,不應(yīng)對(duì)本發(fā)明實(shí)施例的功能和使用范圍帶來任何限制。
如圖4所示,docker容器內(nèi)應(yīng)用進(jìn)程管理設(shè)備40以通用計(jì)算設(shè)備的形式表現(xiàn)。docker容器內(nèi)應(yīng)用進(jìn)程管理設(shè)備40的組件可以包括但不限于:上述至少一個(gè)處理單元41、上述至少一個(gè)存儲(chǔ)單元42、連接不同系統(tǒng)組件(包括處理單元41和存儲(chǔ)單元42)的總線43。
總線43表示幾類總線結(jié)構(gòu)中的一種或多種,包括存儲(chǔ)器總線或者存儲(chǔ)器控制器、外圍總線、圖形加速端口、處理器或者使用多種總線結(jié)構(gòu)中的任意總線結(jié)構(gòu)的局域總線。
存儲(chǔ)單元42可以包括易失性存儲(chǔ)器形式的可讀介質(zhì),例如隨機(jī)存取存儲(chǔ)器(ram)4201和/或高速緩存存儲(chǔ)器4202,還可以進(jìn)一步包括只讀存儲(chǔ)器4203。
存儲(chǔ)單元42還可以包括具有一組(至少一個(gè))程序模塊4204的程序/實(shí)用工具421,這樣的程序模塊包括但不限于:操作系統(tǒng)、一個(gè)或多個(gè)應(yīng)用程序、其它程序模塊以及程序數(shù)據(jù),這些示例中的每一個(gè)或者某種組合中可能包括網(wǎng)絡(luò)環(huán)境的實(shí)現(xiàn)。
docker容器內(nèi)應(yīng)用進(jìn)程管理設(shè)備40也可以與一個(gè)或多個(gè)外部設(shè)備44(例如鍵盤、指向設(shè)備、藍(lán)牙設(shè)備等)通信,還可與一個(gè)或多個(gè)使得用戶能與docker容器內(nèi)應(yīng)用進(jìn)程管理設(shè)備40交互的設(shè)備通信,和/或與使得該docker容器內(nèi)應(yīng)用進(jìn)程管理設(shè)備40與一個(gè)或多個(gè)其他計(jì)算設(shè)備進(jìn)行通信的任何設(shè)備(例如路由器、調(diào)制解調(diào)器等等)通信。這種通信可以通過輸入/輸出(i/o)接口45進(jìn)行。并且,docker容器內(nèi)應(yīng)用進(jìn)程管理設(shè)備還可以通過網(wǎng)絡(luò)適配器46與一個(gè)或多個(gè)網(wǎng)絡(luò)(例如局域網(wǎng),廣域網(wǎng)等)通信。如圖所示,網(wǎng)絡(luò)適配器46通過總線與docker容器內(nèi)應(yīng)用進(jìn)程管理設(shè)備40的其他模塊通信。應(yīng)當(dāng)明白,盡管圖4中未示出,可以結(jié)合docker容器內(nèi)應(yīng)用進(jìn)程管理設(shè)備使用其它硬件和/或軟件模塊,包括但不限于:微代碼、設(shè)備驅(qū)動(dòng)器、冗余處理單元、外部磁盤驅(qū)動(dòng)陣列、raid系統(tǒng)、磁帶驅(qū)動(dòng)器以及數(shù)據(jù)備份存儲(chǔ)系統(tǒng)等。
示例性程序產(chǎn)品
在一些可能的實(shí)施方式中,本發(fā)明的各個(gè)方面還可以實(shí)現(xiàn)為一種程序產(chǎn)品的形式,其包括程序代碼,當(dāng)所述程序產(chǎn)品在終端上運(yùn)行時(shí),所述程序代碼用于使所述終端執(zhí)行本說明書上述“示例性方法”部分中描述的根據(jù)本發(fā)明各種示例性實(shí)施方式的docker容器內(nèi)應(yīng)用進(jìn)程管理方法的步驟,例如所述終端可以執(zhí)行如圖2所示的步驟s201,設(shè)置初始化進(jìn)程;步驟s202,初始化進(jìn)程進(jìn)行分叉操作,得到初始進(jìn)程和第一子進(jìn)程;步驟s203,在初始進(jìn)程進(jìn)行系統(tǒng)信號(hào)注冊(cè)操作,通過監(jiān)聽系統(tǒng)信號(hào)并將系統(tǒng)信號(hào)轉(zhuǎn)發(fā)給第一子進(jìn)程以及第一子進(jìn)程執(zhí)行系統(tǒng)調(diào)用載入到docker容器內(nèi)的至少一個(gè)應(yīng)用進(jìn)程,從而對(duì)第一子進(jìn)程以及所述至少一個(gè)應(yīng)用進(jìn)程進(jìn)行接管。
所述程序產(chǎn)品可以采用一個(gè)或多個(gè)可讀介質(zhì)的任意組合??勺x介質(zhì)可以是可讀信號(hào)介質(zhì)或可讀存儲(chǔ)介質(zhì)??勺x存儲(chǔ)介質(zhì)例如可以是——但不限于——電、磁、光、電磁、紅外線、或半導(dǎo)體的系統(tǒng)、裝置或器件,或者任意以上的組合。可讀存儲(chǔ)介質(zhì)的更具體的例子(非窮舉的列表)包括:具有一個(gè)或多個(gè)導(dǎo)線的電連接、便攜式盤、硬盤、隨機(jī)存取存儲(chǔ)器(ram)、只讀存儲(chǔ)器(rom)、可擦式可編程只讀存儲(chǔ)器(eprom或閃存)、光釬、便攜式緊湊盤只讀存儲(chǔ)器(cd-rom)、光存儲(chǔ)器件、磁存儲(chǔ)器件或者上述的任意合適的組合。
如圖5所示,描述了根據(jù)本發(fā)明的實(shí)施方式的用于docker容器內(nèi)應(yīng)用進(jìn)程管理的程序產(chǎn)品50,其可以采用便攜式緊湊盤只讀存儲(chǔ)器(cd-rom)并包括程序代碼,并可以在終端,例如個(gè)人電腦上運(yùn)行。然而,本發(fā)明的程序產(chǎn)品不限于此,在本文件中,可讀存儲(chǔ)介質(zhì)可以是任何包含或存儲(chǔ)程序的有形介質(zhì),該程序可以被指令執(zhí)行系統(tǒng)、裝置或器件使用或者與其結(jié)合使用。
可讀信號(hào)介質(zhì)可以包括在基帶中或者作為載波一部分傳播的數(shù)據(jù)信號(hào),其中承載了可讀程序代碼。這種傳播的數(shù)據(jù)信號(hào)可以采用多種形式,包括——但不限于——電磁信號(hào)、光信號(hào)或上述的任意合適的組合。可讀信號(hào)介質(zhì)還可以是可讀存儲(chǔ)介質(zhì)以外的任何可讀介質(zhì),該可讀介質(zhì)可以發(fā)送、傳播或者傳輸用于由指令執(zhí)行系統(tǒng)、裝置或者器件使用或者與其結(jié)合使用的程序。
可讀介質(zhì)上包含的程序代碼可以用任何適當(dāng)?shù)慕橘|(zhì)傳輸,包括——但不限于——無線、有線、光纜、rf等等,或者上述的任意合適的組合。
可以以一種或多種程序設(shè)計(jì)語言的任意組合來編寫用于執(zhí)行本發(fā)明操作的程序代碼,所述程序設(shè)計(jì)語言包括面向?qū)ο蟮某绦蛟O(shè)計(jì)語言——例如java、c++等,還包括常規(guī)的過程式程序設(shè)計(jì)語言——諸如“c”語言或類似的程序設(shè)計(jì)語言。程序代碼可以完全地在用戶計(jì)算設(shè)備上執(zhí)行、部分地在用戶設(shè)備上執(zhí)行、作為一個(gè)獨(dú)立的軟件包執(zhí)行、部分在用戶計(jì)算設(shè)備上部分在遠(yuǎn)程計(jì)算設(shè)備上執(zhí)行、或者完全在遠(yuǎn)程計(jì)算設(shè)備或服務(wù)器上執(zhí)行。在涉及遠(yuǎn)程計(jì)算設(shè)備的情形中,遠(yuǎn)程計(jì)算設(shè)備可以通過任意種類的網(wǎng)絡(luò)——包括局域網(wǎng)或廣域網(wǎng)——連接到用戶計(jì)算設(shè)備,或者,可以連接到外部計(jì)算設(shè)備(例如利用因特網(wǎng)服務(wù)提供商來通過因特網(wǎng)連接)。
應(yīng)當(dāng)注意,盡管在上文詳細(xì)描述中提及了docker容器內(nèi)應(yīng)用進(jìn)程管理裝置的若干單元,但是這種劃分僅僅并非強(qiáng)制性的。實(shí)際上,根據(jù)本發(fā)明的實(shí)施方式,上文描述的兩個(gè)或更多單元的特征和功能可以在一個(gè)單元中具體化。反之,上文描述的一個(gè)單元的特征和功能可以進(jìn)一步劃分為由多個(gè)單元來具體化。
此外,盡管在附圖中以特定順序描述了本發(fā)明方法的操作,但是,這并非要求或者暗示必須按照該特定順序來執(zhí)行這些操作,或是必須執(zhí)行全部所示的操作才能實(shí)現(xiàn)期望的結(jié)果。附加地或備選地,可以省略某些步驟,將多個(gè)步驟合并為一個(gè)步驟執(zhí)行,和/或?qū)⒁粋€(gè)步驟分解為多個(gè)步驟執(zhí)行。
雖然已經(jīng)參考若干具體實(shí)施方式描述了本發(fā)明的精神和原理,但是應(yīng)該理解,本發(fā)明并不限于所公開的具體實(shí)施方式,對(duì)各方面的劃分也不意味著這些方面中的特征不能組合以進(jìn)行受益,這種劃分僅是為了表述的方便。本發(fā)明旨在涵蓋所附權(quán)利要求的精神和范圍內(nèi)所包括的各種修改和等同布置。